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