在 .bashrc 中更改用户会破坏 SFTP

在 .bashrc 中更改用户会破坏 SFTP

在我学习 Amazon EC2 的过程中,我认为在登录时始终以 root 用户身份登录是一个好主意。我将这一行添加到我的 .bashrc 中

/usr/bin/sudo /bin/bash

这样,我就不必以 root 用户身份通过​​ SSH 登录,但登录时会自动切换。但是,当此文件位于 .bashrc 中时,它会破坏任何尝试连接的 SFTP 客户端。错误因使用的客户端而异,但通常它们都以超时结束,即使它们成功连接到远程主机。WinSCP 建议主机上可能没有运行 SFTP 服务器。

我现在完全意识到添加该行是一个错误的举动,但我不知道为什么这会破坏 SFTP。我以 ec2-user 身份登录,但变成了 root(我认为),但我不明白为什么这会导致问题。

答案1

在 bash 世界中,配置文件初始化文件经常调用 rc 初始化文件,如这个 StackOverflow 帖子. 因此 rc init 文件不绑定到仅交互的 shell。

据我所知,SFTP 协议是 SSH shell 的非交互式使用,用于执行 sftp 服务器程序,该程序通过其stdinstdout流与调用者进行交互。关于您的问题,我猜会发生以下两种不想要的事情之一:

  • sudo命令要求输入密码,这是 sftp 客户端所不希望看到的,因为它希望与 sftp 服务器进行二进制交互

  • root 用户无权访问 sftp 层调用的二进制文件(由于权限设置 - 但我猜这是 sudo 的情况)

您应该有两种方法来解决这个问题:

  • 限制 root 自动切换到仅交互 shell,就像 Martin 建议的那样,例如使用终端命令:

    if tty --silent
    then
        /usr/bin/sudo /bin/bash
    fi
  • 或者创建/修改您的私有 .bashprofile 以不从中调用您的 rc 文件(至少仍然设置您的 PATH)。

答案2

通常,.bashrc先获取源代码,然后启动 shell 或 SFTP 服务器。

但是你的操作.bashrc永远不会完成,因为它会自行启动 shell。因此 SFTP 服务器永远不会启动。

因此,SFTP 客户端要么等待 SFTP 协议握手超时;要么尝试将某些随机 shell 输出解码为 SFTP 数据包失败。


一种可能的解决方法是sudo仅用于交互式会话(即不用于非交互式 SFTP 会话)。

虽然通常应该.bashrc只用于交互式会话。所以它不应该干预 SFTP。您的服务器似乎配置有误。

相关内容