執行 ssh 命令時如何設置 PATH?
假設使用者
/bin/bash
在/etc/passwd
. 然後ssh user@host command
使用 Bash 執行命令。但是,該外殼既不是登錄也不是互動式的,這意味著既不是~/.bash_profile
也不~/.bashrc
是來源。在那種情況下如何設置PATH
環境變數以便可以找到並執行執行檔?是否建議在實際命令前加上source ~/.bashrc
?編輯。這個問題對於 Bash 來說是微不足道的,因為(正如人們指出的那樣)
~/.bashrc
是在這種情況下產生的。明確的答案來自以下段落man bash
:Bash 嘗試確定它何時在其標準輸入連接到網路連接的情況下執行,就像由遠端 shell 守護程序(通常是 rshd)或安全 shell 守護程序 sshd 執行時一樣。如果
bash
確定它正在以這種方式執行,它會從 讀取並執行命令~/.bashrc
,如果該文件存在並且是可讀的。如果呼叫為 ,它將不會執行此操作sh
。該--norc
選項可用於禁止此行為,並且該--rcfile
選項可用於強制讀取另一個文件,但 rshd 和 sshd 通常都不會使用這些選項呼叫 shell 或允許指定它們。
你的可能性很小:
PATH
在伺服器上設置in~/.ssh/environment
(需要通過PermitUserEnvironment yes
in啟用sshd_config
)。- 使用二進製文件的完整路徑
- 正如您所提到的,手動 source
.bashrc
: 在命令前加上. ~/.bashrc
(orsource
)這在很大程度上取決於案例,你會走哪條路。
您將本地設置等同於遠端設置。
在本地,一個 bash 實例,即您在其中編寫的目前正在執行的 shell:
ssh user@host command
將作為客戶端 ssh 執行命令 ssh(僅此而已)。
為此,本地shell 不需要啟動子 shell 或新 shell 或登錄。
該命令被執行為
ls
命令是:本地。客戶端 ssh 命令打開到遠端系統的網路連接,如果經過正確驗證,將啟動一個新的shell 來執行作為 ssh 參數寫入的命令,或者,如果沒有給出參數,則期待進一步的命令在那個連接上。
新的遠端shell 必須是登錄 shell,因為遠端使用者(該系統)需要經過身份驗證才能登錄。或者,如果給出了某些特定命令,只需使用經過身份驗證的使用者權限執行此類命令。
$file sourced
您可以通過在每個文件的開頭(在遠端系統中)添加 a 來查看哪些文件的來源(更改文件需要 root/etc/
):$ a=(~/.bashrc ~/.profile /etc/bash.bashrc /etc/profile) $ for f in "${a[@]}"; do sed -i '1 i\echo "'"$f"' was read"\n' "$f"; done
然後只需啟動一個 ssh 控制台:
$ ssh sorontar@localhost /etc/profile was read /etc/bash.bashrc was read /home/sorontar/.profile was read /home/sorontar/.bashrc was read
在這種情況下,
bashrc
讀取這兩個文件是因為每個profile
文件都有包含它們的命令,而不是因為登錄 shell 直接獲取它們。$ ssh sorontar@localhost : /etc/bash.bashrc was read /home/sorontar/.bashrc was read
在這個系統中,
bashrc
在這兩種情況下都會讀取 where。無需
source ~/.bashrc
在命令中添加 a 即可執行。更改路徑
您需要做的就是包括正確的設置來更改“$PATH”,或者
/etc/bash.bashrc
為所有在這個系統中啟動 shell 的使用者。或者~/.bashrc
適用於每個需要它的使用者。您可以添加(或編輯)使用者的骨架,.bashrc
以/etc/skel/
使創建的任何新使用者都具有可用的正確文件。以上僅對 bash 有效。如果您需要該設置適用於所有 shell,則可能使用 ssh 文件
~/.ssh/environment
為每個需要它的使用者設置環境變數 PATH。或者/etc/ssh/sshrc
用於執行 ssh 伺服器的系統中的全域設置(請閱讀文件部分以man sshd
獲取更多詳細資訊)。