背景
這個問題在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 <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