AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 485487
Accepted
Joel G Mathew
Joel G Mathew
Asked: 2013-03-07 22:24:31 +0800 CST2013-03-07 22:24:31 +0800 CST 2013-03-07 22:24:31 +0800 CST

在不破坏 sftp 的情况下使用 .bashrc

  • 772

我的问题是我需要设置一些变量,并在每次登录 ssh shell 时输出几行,同时我必须能够使用 sftp 通过 Filezilla 来传输文件。

现在,根据http://www.openssh.org/faq.html上的 openssh 常见问题解答,如果您的启动脚本回显任何类型的输出,它就会与 sftp 混淆。因此,它要么无限期地延迟,要么因“退出代码为 128 的服务器关闭连接”而出错。

我尝试过将 .bashrc 移动到 .bash_profile 或在 .bashrc 中使用以下代码等解决方案:

if [ "$TERM" != "dumb" ]
then
   source .bashc_real
fi

和:

if [ "$TERM" = "xterm" ]
then
   source .bashc_real
fi

但是,没有任何效果。我的 shell 终端是 bash,我用 filezilla 连接到 sftp。

linux
  • 6 6 个回答
  • 14070 Views

6 个回答

  • Voted
  1. Best Answer
    Mike
    2013-03-07T22:28:27+08:002013-03-07T22:28:27+08:00

    尝试这样做

    if [ "$SSH_TTY" ]
    then
       source .bashc_real
    fi
    
    • 28
  2. Insyte
    2013-03-07T22:48:03+08:002013-03-07T22:48:03+08:00

    迈克的回答可能会奏效。但值得指出的是,您可以仔细选择要将冗长的内容放入哪些启动文件来完成此操作。来自 bash 手册页:

    当 bash 作为交互式登录 shell 调用时,或作为带有 --login 选项的非交互式 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会依次查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件开始读取和执行命令。启动 shell 时可以使用 --noprofile 选项来抑制此行为。

    当启动非登录 shell 的交互式 shell 时,bash 从 ~/.bashrc 读取并执行命令(如果该文件存在)。这可以通过使用 --norc 选项来禁止。--rcfile 文件选项将强制 bash 从文件而不是 ~/.bashrc 读取和执行命令。

    sftp/scp 工具启动一个交互式非登录 shell,因此 .bashrc 将被获取。许多发行版从 .bash_profile 获取 .bashrc,反之亦然,因此它可能会让人感到困惑。测试登录环境清洁度的一个好技巧是使用命令 ssh 登录,该命令模拟与 scp/sftp 连接相同的方式。例如:ssh myhost /bin/true将向您准确显示 scp/sftp 在连接时看到的内容。

    一个简单的演示:

    insyte@mazer:~$ echo "echo Hello from .profile" > .profile
    insyte@mazer:~$ echo "echo Hello from .bashrc" > .bashrc
    
    sazerac:~ insyte$ ssh mazer /bin/true
    Hello from .bashrc
    sazerac:~ insyte$
    
    insyte@mazer:~$ rm .bashrc
    
    sazerac:~ insyte$ ssh mazer /bin/true
    sazerac:~ insyte$
    

    第一个测试将导致 scp/sftp/rsync 等中断。第二个版本会工作得很好。

    • 18
  3. user163384
    2013-03-08T03:11:51+08:002013-03-08T03:11:51+08:00

    如果您使用的是 csh:

    if ($?prompt)
      ... interactive stuff ...
    

    如果是 bash:

    if [[ $- == *i* ]]; then
      ... interactive stuff ...
    fi
    

    或者使用 bash 正则表达式:

    if [[ $- =~ i ]]; then
      ... interactive stuff ...
    fi
    

    这些行应该在您输出/回显某些内容的行之前。

    • 4
  4. Vijay Padiyar
    2017-01-12T21:07:35+08:002017-01-12T21:07:35+08:00

    迈克的解决方案也对我有用。但由于我的默认 shell 是 TCSH,我不得不按如下方式稍微编辑修复程序(在 .tcshrc 中):

    if ( $?SSH_TTY ) then
        exec /bin/bash
    endif
    

    只是想我会分享给大家的利益。

    • 1
  5. Totor
    2019-11-22T06:30:18+08:002019-11-22T06:30:18+08:00

    这是我的(默认).bashrc文件的第一行:

    # ~/.bashrc: executed by bash(1) for non-login shells.
    # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
    # for examples
    
    # If not running interactively, don't do anything
    case $- in
        *i*) ;;
          *) return;;
    esac
    

    检查交互式会话避免搞乱 SCP、SFTP 或ssh remote-host command模式。

    如果没有这个,如果您的文件.bashrc使用echo或在 stdout 上打印其他一些东西,您可能会遇到这种错误:

    • 文件传输协议:Received message too long 168435779
    • SCP:protocol error: unexpected <newline>
    • 1
  6. Bob Noonan
    2019-10-30T07:13:41+08:002019-10-30T07:13:41+08:00

    我更喜欢这里提到的其他一些解决方案,但我想我放弃了我目前在我的 bash 和 csh 虚拟机上使用的解决方案,以防止由于我的启动脚本中的 echo 命令导致 SFTP 断开连接,以防万一有人发现这些信息有帮助.

    在巴什:

    if [ $TERM == "xterm" ] || [ $TERM == "xterm-256color" ]; then
      echo "Xterm display identified: echo enabled"
      echo_disable="0"
    else
      echo_disable="1"
    fi
    
    # Use the following for all subsequent echo commands
    if [ $echo_disable == 0 ]; then
     echo "Safe to display on Xterm"
    fi
    

    在 csh 中:

    if ($TERM == "xterm") then
      echo "Xterm display identified: echo enabled"
      set echo_disable = "0"
    else
      set echo_disable = "1"
    endif
    
    # Use the following for all subsequent echo commands
    if !( "$echo_disable" ) echo "Safe to display on Xterm"
    

    这有点蛮力,但确实有效。

    • 0

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve