ssh、特定のシェル(ash)を実行し、リモートシステムから環境を取得します。

ssh、特定のシェル(ash)を実行し、リモートシステムから環境を取得します。

これはこの質問に関する後続の質問です。ssh、特定のシェルを起動し、リモートシステムでコマンドを実行しますか?、についてより具体的に説明し、ashsshセッションでシェルを起動するときに.bashrcファイルをインポートすることが私には適していないという事実に焦点を当てます。

私はビジボックス版を持っていない組み込みLinuxデバイスを使用していますshash私たちbashは共通のユーザー名(root)と共通の実行環境を共有します。

PS1ただし、いくつかのカスタムエイリアスとカスタムプロンプトstring1変数が必要です。

これは一般的なSSHセッションの例です。sshpassパスワードをに渡し、sshパスワードを~/pwファイルに保存します。

デフォルトのシェルには別名がなく、-sh別名がないことがわかります。デフォルトPS1のプロンプト文字列にもパスは表示されません。

$ sshpass -f ~/pw ssh [email protected]
[root@device]$ echo $0
-sh
[root@device]$ alias
[root@device]$ 

デバイスにはありませんが、bashには明らかに似ていますbashashだから私はsshをするときにシェルとして使用したいと思います。また、SSH経由で接続したいUbuntuシステムに~/.bashrcあるUbuntuのデフォルトファイルをコピーしたいと思います。/etc/skel/.bashrc~から、それを取得できるようにデバイスに接続し、/tmp/.bashrc私のsshコマンドがそれを行うことができるようにしたい。~/.bashrcホームディレクトリは読み取り専用なので、リモートデバイスにコピーできません。

次を試しましたが、次のエラーが発生します。

注文する:

sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp/.bashrc \
&& sshpass -f ~/pw ssh -t [email protected] '. /tmp/.bashrc'

結果:

Connection to 192.168.0.2 closed.

SSHセッションが確立されていません。

ashその後、次のコマンドを試しましたが、結果は次のようになります。シェルに入ってもソーシングが機能しないことを示します。

$ sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp/.bashrc \
&& sshpass -f ~/pw ssh -t [email protected] '. /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'

また、行16、24、111shoptに見つからないため、再エラーが表示されます。私が送信した.bashrcファイルでそれをコメントアウトしても、上記の結果はまだ同じです。

上記のコマンドをどのように機能させることができますか? sshで接続し、シェルをbashに似たものに設定してから、/tmp/.bashrcscpしたファイルをインポートしたいです。


同様の組み込みデバイスでするインストールbashすると、このcmdは完全に実行されます。私のレポに文書化されているように:

sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp \
&& sshpass -f ~/pw ssh -t [email protected] 'bash --rcfile /tmp/.bashrc'

の場合、bash最後bash --rcfile /tmp/.bashrcに ssh cmd を使用する必要があります。ただし、OUTなしのデバイスで同様の動作をbash実行するのに役立ちます。ash

ベストアンサー1

なぜ走ったのですかash? busyboxを持つシステムが2つの異なるシェルを持つ可能性はほとんどありません。 (技術的にはこれ/bin/shとは異なる場合がありますが、/bin/ash内蔵デバイスではほとんど設定されていません。)

いくつかの単純なエイリアスや関数に加えて、.bashrcash(またはbashではなくシェル)で動作する一般的な項目はほとんどありません。機能しないものには、shoptキーバインディング、プロンプト設定、POSIX以外の拡張機能を使用するすべての機能、組み込みデバイスに存在しないコマンドを参照するエイリアスなどが含まれます。

… ssh -t [email protected] '. /tmp/.bashrc; ash'

/tmp/.bashrc元のシェルから読み取った後、別のシェルプログラムを実行しています。他のプログラムはシェルの内部設定(エイリアスなど)を継承しません。これは以下に関連しています。ssh、特定のシェルを起動し、リモートシステムでコマンドを実行しますか?.profile環境変数を設定する読み取りに関する内容です。はい遺伝学。

$ENVBusyBoxのAsh対話型起動が開始されると、名前のあるファイルからコマンドを読み込みます。 (BusyBoxのshはashまたはhushです。コマンドがあるため、あなたのshはashです。)したがって、コマンドを読みたいファイルの名前にash設定できます。ENV

… ssh -t [email protected] 'export ENV=/tmp/.bashrc; sh -i'

おすすめ記事