解決SSH遠端執行命令找不到環境變數的問題

2021-09-08 05:18:31 字數 2569 閱讀 4014

通過ssh執行遠端主機的命令或指令碼時,經常會出現找不到自定義環境變數的問題。但是,如果通過ssh登入遠端主機,然後再執行相同的命令或指令碼,那麼此時執行又是成功的。兩種相似的方法,得到的結果卻截然不同,看起來很詭異的現象,根本原因在於這兩種方式使用的bash模式不同!

這種方式會使用bash的interactive + login shell模式,這裡面有兩個概念需要解釋:interactive和login。

login故名思義,即登陸,login shell是指使用者以非圖形化介面或者以ssh登陸到機器上時獲得的第乙個shell,簡單些說就是需要輸入使用者名稱和密碼的shell。因此通常不管以何種方式登陸機器後使用者獲得的第乙個shell就是login shell。

interactive意為互動式,這也很好理解,interactive shell會有乙個輸入提示符,並且它的標準輸入、輸出和錯誤輸出都會顯示在控制台上。所以一般來說只要是需要使用者互動的,即乙個命令乙個命令的輸入的shell都是interactive shell。而如果無需使用者互動,它便是non-interactive shell。通常來說如bash script.sh此類執行指令碼的命令就會啟動乙個non-interactive shell,它不需要與使用者進行互動,執行完後它便會退出建立的shell。

在interactive + login shell模式中,shell首先會載入/etc/profile檔案,然後再嘗試依次去載入下列三個配置檔案之一,一旦找到其中乙個便不再接著尋找:

這種方式會使用bash的non-interactive + non-login shell模式,它會建立乙個shell,執行完指令碼之後便退出,不再需要與使用者互動。

no-login shell,顧名思義就是不是在登入linux系統時啟動的(比如你在命令列提示符上輸入bash啟動)。它不會去執行/etc/profile檔案,而會去使用者的home目錄檢查.bashrc並載入。

系統執行shell指令碼的時候,就是屬於這種non-interactive shell。bash通過bash_env環境變數來記錄要載入的檔案,預設情況下這個環境變數並沒有設定。如果有指定檔案,那麼shell會先去載入這個檔案裡面的內容,然後再開始執行shell指令碼。

由此可見,如果要解決ssh遠端執行命令時找不到自定義環境變數的問題,那麼可以在登入使用者的home目錄的.bashrc中新增需要的環境變數。

當登入之後,直接在某台遠端主機:10.0.63.9上執行日期格式化的命令時,列印的是正確的,如下:

+%y%m%d%h%m%s

"); echo

$buildtimestampstr

170927165847

當在另外一台主機(10.0.251.216)上遠端執行ssh命令時,列印的結果不正確(差了八個時區),如下:

[root@host-10-0-251-216 ~]# cat

sshtime

buildtimestamp=2017-09-27t16:58:47.291+08:00; buildtimestampstr=$(date -d $buildtimestamp "

+%y%m%d%h%m%s

"); echo

$buildtimestampstr

[root@host-10-0-251-216 ~]# a=`cat

sshtime `

[root@host-10-0-251-216 ~]# echo

$abuildtimestamp=2017-09-27t16:58:47.291+08:00; buildtimestampstr=$(date -d $buildtimestamp "

+%y%m%d%h%m%s

"); echo

$buildtimestampstr

[root@host-10-0-251-216 ~]# ssh [email protected]

$aroot@

10.0.63.9

's password:

170927085847

此時修改10.0.63.9上,root根目錄下的.bashrc檔案,增加tz的設定,再次執行ssh列印的結果是正確的:

.bashrc

# .bashrc

# user specific aliases and functions

alias

rm='

rm -i

'alias

cp='

cp -i

'alias

mv='

mv -i

'export tz="

asia/shanghai

"# source global definitions

if [ -f /etc/bashrc ]; then

. /etc/bashrcfi

[root@host-10-0-251-216 ~]# ssh [email protected]

$aroot@

10.0.63.9

's password:

170927165847

解決SSH遠端執行命令找不到環境變數的問題

通過ssh執行遠端主機的命令或指令碼時,經常會出現找不到自定義環境變數的問題。但是,如果通過ssh登入遠端主機,然後再執行相同的命令或指令碼,那麼此時執行又是成功的。兩種相似的方法,得到的結果卻截然不同,看起來很詭異的現象,根本原因在於這兩種方式使用的bash模式不同!這種方式會使用bash的int...

linux執行遠端命令找不到環境變數

我配置的gopath在 home go下面,本質的問題還是找不到自定義的環境變數 但是直接用ssh登入到遠端伺服器上面以後,再執行相應的指令碼時成功的。查閱資料發現,這兩種方式使用的bash模式不同 bash shell的一種,也是現在大部分的linux的發行版本,shell就簡單理解成命令列直譯器...

ssh遠端執行命令

使用ssh不僅可以登入到遠端的linux主機,還可以執行命令。如果是要登入到遠端linux主機,那麼使用下面的命令 ssh username remoteip example ssh hduser 192.168.0.1 這個將開啟乙個登入到遠端主機192.168.0.1的login shell如果...