一次scp連線伺服器無響應但ssh正常的問題

sjmuvx發表於2024-05-01

背景

這個問題在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-loginnon-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-shellnon-login shell?參考文章。非登入互動式shell:ssh example.com <my-script-which-is-stored-locally;非登入非互動式shell:ssh example.com my-script-which-is-on-the-remote-machine

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

相關文章