これはこの質問に関する後続の質問です。ssh、特定のシェルを起動し、リモートシステムでコマンドを実行しますか?、についてより具体的に説明し、ash
sshセッションでシェルを起動するときに.bashrcファイルをインポートすることが私には適していないという事実に焦点を当てます。
私はビジボックス版を持っていない組み込みLinuxデバイスを使用していますsh
。ash
私たち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には明らかに似ていますbash
。ash
だから私は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/.bashrc
scpしたファイルをインポートしたいです。
同様の組み込みデバイスでするインストール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
内蔵デバイスではほとんど設定されていません。)
いくつかの単純なエイリアスや関数に加えて、.bashrc
ash(またはbashではなくシェル)で動作する一般的な項目はほとんどありません。機能しないものには、shopt
キーバインディング、プロンプト設定、POSIX以外の拡張機能を使用するすべての機能、組み込みデバイスに存在しないコマンドを参照するエイリアスなどが含まれます。
… ssh -t [email protected] '. /tmp/.bashrc; ash'
/tmp/.bashrc
元のシェルから読み取った後、別のシェルプログラムを実行しています。他のプログラムはシェルの内部設定(エイリアスなど)を継承しません。これは以下に関連しています。ssh、特定のシェルを起動し、リモートシステムでコマンドを実行しますか?.profile
環境変数を設定する読み取りに関する内容です。はい遺伝学。
$ENV
BusyBoxのAsh対話型起動が開始されると、名前のあるファイルからコマンドを読み込みます。 (BusyBoxのshはashまたはhushです。コマンドがあるため、あなたのshはashです。)したがって、コマンドを読みたいファイルの名前にash
設定できます。ENV
… ssh -t [email protected] 'export ENV=/tmp/.bashrc; sh -i'
答え2
デフォルトのシェルはこの/etc/passwd
ファイルに保存されます。すべてのユーザーはこのchsh
コマンドを使用してデフォルトのシェルを変更できます。承認されたシェルはにリストされています/etc/shells
。もちろん、このシェルに切り替える前にbashが存在する必要があります。