ssh,啟動一個特定的 shell (ash),並在遠端機器上獲取你的環境
這是這個問題的一種後續問題:ssh,啟動特定的shell,並在遠端機器上執行命令?, 除了更具體地關於
ash
, 並專注於採購 .bashrc 文件作為在 ssh 會話中啟動 shell 的一部分對我不起作用的事實。我在一個嵌入式 Linux 設備上,它有一個 busybox 版本的
sh
andash
,但沒有bash
. 我們共享一個共同的使用者名 (root
) 和一個共同的執行環境。但是,我想要一些自定義別名和自定義
PS1
Prompt String 1 變數。這是一個普通的 ssh 會話範例。請注意,我
sshpass
用於將密碼傳遞給ssh
,而我的密碼儲存在~/pw
文件中。你可以看到預設的shell是
-sh
並且沒有別名。預設PS1
提示字元串也沒有顯示路徑。$ sshpass -f ~/pw ssh root@192.168.0.2 [root@device]$ echo $0 -sh [root@device]$ alias [root@device]$
該設備沒有
bash
,但它確實有ash
,這顯然是類似 bash 的。所以,我想在 ssh 中創建我的 shell。我還想將 Ubuntu 的預設~/.bashrc
文件(位於/etc/skel/.bashrc
我正在 ssh-ing 的 Ubuntu 機器上*)*複製到設備,/tmp/.bashrc
以便我可以獲取它,我想要我的 ssh 命令來做到這一點。我無法複製到~/.bashrc
遠端設備上,因為主目錄是只讀的。我嘗試了以下方法,但收到以下錯誤:
命令:
sshpass -f ~/pw scp /etc/skel/.bashrc root@192.168.0.2:/tmp/.bashrc \ && sshpass -f ~/pw ssh -t root@192.168.0.2 '. /tmp/.bashrc'
結果:
Connection to 192.168.0.2 closed.
沒有建立 ssh 會話。
ash
然後我嘗試了以下命令,結果如下,表明雖然輸入了 shell ,但 source 不起作用。$ sshpass -f ~/pw scp /etc/skel/.bashrc root@192.168.0.2:/tmp/.bashrc \ && sshpass -f ~/pw ssh -t root@192.168.0.2 '. /tmp/.bashrc; ash' ~ # echo $0 ash ~ # alias ~ #
不過我現在可以
. /tmp/.bashrc
手動執行,而且效果很好。請注意,在有效的採購之後,我有一個改進的提示字元串和新的別名:~ # . /tmp/.bashrc ash: /tmp/.bashrc: line 16: shopt: not found ash: /tmp/.bashrc: line 24: shopt: not found ash: /tmp/.bashrc: line 111: shopt: not found root@device:~# alias l='ls -CF' alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '"'"'s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'"'"')"' la='ls -A' ll='ls -alF'
shopt
由於未找到,您還會看到第 16、24 和 111 行的 ash 錯誤。即使我在發送過來的 .bashrc 文件中將它們註釋掉,如上所示的結果仍然相同。我怎樣才能讓我的上述命令工作?我希望它可以通過 ssh 進入,將 shell 設置為更像 bash 的東西,然後
/tmp/.bashrc
獲取我的 scp’ed 文件。在已安裝的類似嵌入式設備上*,*
bash
此 cmd 執行良好,正如我在我的 repo 中記錄的那樣:sshpass -f ~/pw scp /etc/skel/.bashrc root@192.168.0.2:/tmp \ && sshpass -f ~/pw ssh -t root@192.168.0.2 'bash --rcfile /tmp/.bashrc'
對於
bash
,bash --rcfile /tmp/.bashrc
在 ssh cmd 末尾使用是我需要的。但是,對於沒有 OUT 的設備bash
,我需要幫助來獲得這種行為ash
或類似行為。
你為什麼要跑步
ash
?帶有busybox 的系統不太可能有兩個不同的shell。(從技術上講,它可能/bin/sh
與 .shell 不同/bin/ash
,但它在嵌入式設備上的設置非常不可能。)除了一些簡單的別名或函式之外,很少有典型內容
.bashrc
可能在 ash(或任何非 bash 的 shell)中工作。不起作用的東西包括shopt
,鍵綁定,提示設置,任何使用非 POSIX 擴展的函式,任何引用嵌入式設備上不存在的命令的別名。… ssh -t root@192.168.0.2 '. /tmp/.bashrc; ash'
您正在閱讀
/tmp/.bashrc
原始 shell,然後執行不同的 shell 程序。那個不同的程序不會繼承任何 shell 的內部設置,例如別名。與 ssh 完全不同的問題,啟動特定的 shell,然後在遠端機器上執行命令?這是關於閱讀.profile
的,它設置了繼承的環境變數。
$ENV
BusyBox 的 ash 在互動啟動時從名稱所在的文件中讀取命令。(BusyBox 的 sh 可以是 ash 或 hush;既然你有ash
命令,你的就是 ash。)所以你可以設置ENV
為你想讀取命令的文件名。… ssh -t root@192.168.0.2 'export ENV=/tmp/.bashrc; sh -i'