Bash

ssh,啟動一個特定的 shell (ash),並在遠端機器上獲取你的環境

  • November 11, 2021

這是這個問題的一種後續問題:ssh,啟動特定的shell,並在遠端機器上執行命令?, 除了更具體地關於ash, 並專注於採購 .bashrc 文件作為在 ssh 會話中啟動 shell 的一部分對我不起作用的事實。

我在一個嵌入式 Linux 設備上,它有一個 busybox 版本的shand ash,但沒有bash. 我們共享一個共同的使用者名 ( root) 和一個共同的執行環境。

但是,我想要一些自定義別名和自定義PS1Prompt 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'

對於bashbash --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的,它設置繼承的環境變數。

$ENVBusyBox 的 ash 在互動啟動時從名稱所在的文件中讀取命令。(BusyBox 的 sh 可以是 ash 或 hush;既然你有ash命令,你的就是 ash。)所以你可以設置ENV為你想讀取命令的文件名。

… ssh -t root@192.168.0.2 'export ENV=/tmp/.bashrc; sh -i'

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