在我学习 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 服务器程序,该程序通过其stdin
和stdout
流与调用者进行交互。关于您的问题,我猜会发生以下两种不想要的事情之一:
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。您的服务器似乎配置有误。