一次scp连接服务器无响应但ssh正常的问题
一次scp连接服务器无响应但ssh正常的问题
背景
这个问题在Linux上出现了很久,具体表现是用work账户进行scp时,输入密码后就一直不动;用ssh登录没任何问题;用root账户进行scp能成功。
网上找了很多资料,这篇文章使用exec zsh导致该问题的出现。我在.bashrc最后加上了exec $HOME/zsh-5.9/bin/zsh使得work账户能用zsh。最根本的原因就是使用了zsh导致scp出现了问题,解决方案是让scp使用的shell为bash即可。
知识点
scp,客户端使用ssh命令连接到远程服务器,并指定要复制的文件或目录,然后客户端和服务器之间建立了一个加密的连接,用于传输文件数据。在传输过程中,数据被加密以确保其安全性。如果
ssh只是在远程主机上执行交互命令并接收结果,那么是一个non-login且non-interactive的shell。login-shell会按如下顺序执行脚本:- 执行
/etc/profile - 执行
/etc/profile.d/目录下所有脚本 - 执行用户所属的
~/.bash_profile(这里它是优先级最高的,如果不存在则会按照优先级顺序读取~/.bash_login、~/.profile) - 执行
~/.bashrc ~/.bashrc执行/etc/bashrc(这是因为在rc文件里定义了读取/etc/bashrc)
- 执行
non-login shell会按如下顺序执行脚本:- 执行
~/.bashrc ~/.bashrc执行/etc/bashrc
- 执行
如何区分
login-shell和non-login shell?参考文章。非登录交互式shell:ssh example.com <my-script-which-is-stored-locally;非登录非交互式shell:ssh example.com my-script-which-is-on-the-remote-machine。通常我们定制一些配置时,将配置写在
~/.bashrc中,然后在~/.bash_profile中读取~/.bashrc,保证login-shell和交互式non-login shell得到相同的配置。
问题解决
将~/.bashrc中的exec zsh移动到~/.bash_profile中即可解决问题,并且可以反推出scp使用的是非登录交互式shell。
vim ~/.bash_profile# 最后添加 exec $HOME/zsh-5.9/bin/zshvim ~/.bashrc删除下面行 exec $HOME/zsh-5.9/bin/zsh