Bash

執行 ssh 命令時如何設置 PATH?

  • April 25, 2022

假設使用者/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 yesin啟用sshd_config)。
  • 使用二進製文件的完整路徑
  • 正如您所提到的,手動 source .bashrc: 在命令前加上. ~/.bashrc(or source)

這在很大程度上取決於案例,你會走哪條路。

您將本地設置等同於遠端設置。

在本地,一個 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獲取更多詳細資訊)。

引用自:https://unix.stackexchange.com/questions/332532