フルログインシェルでリモートsshコマンドを実行する


48

私は次のようなことをしたいのですが、ssh example.com 'ls'sshマンページごとに:

コマンドが指定されている場合、ログインシェルの代わりにリモートホストで実行されます。

そのlsため、出力が表示され、sshが終了します。

私が理解できないのは、完全なログインシェルを開いてから、そのシェル内でコマンドを実行する方法です。コマンドの実行後にシェルを開いたままにします。私が手動で以下を行ったかのように:

  localhost$ ssh example.com 
example.com$ ls
             /folder1 
             /folder2 
example.com$ _

何か案は?


これは似たような質問superuser.com/questions/261617/…ですが、私がやろうとしていることには実際に当てはまるような答えはありません。
マシュー

どうssh example.com 'ls;bash'
アンドレイスカイニコフス

2番目のシェルを対話型シェルにするには、システムに-iが必要です。
フレキソ

オプション-tは、質問に対する答えです。他のオプション(キーチェーンなど)は存在しますが、実際のニーズによって異なります。
hornetbzz

@hornetbzz -tは擬似ttyを提供します。しかし、それ以外は動作は同じです。対話型シェルを起動し、そのシェル内でコマンドを実行し、コマンドの実行後もシェルを開いたままにしておきたいです。
マシュー

回答:


40

lsログインシェルでbashを実行してから実行するように指示するだけです

$ ssh user@host  -t 'bash -l -c "ls;bash"'

2
残念ながら、これはを使用している間は機能しないようscreenです。それ以外の場合、これは私がやろうとしていたことを行うようです。
マシュー

31
ssh user@host -t 'ls; exec $SHELL -l'

-t擬似端末割り当てを強制します。これを使用して、リモートマシンで任意の画面ベースのプログラムを実行できます。よりも少し適切ですbash -i

exec 新しいプロセスは作成されません。

-l〜/ .bash_profile、〜/ .bash_login、および〜/ .profileをこの順序で探し、コマンドを読み取り、実行します...これがないと、おそらく〜/ binディレクトリからスクリプト/コマンドを実行できません。 from〜/ .profileは-lフラグなしでは実行されません:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

@grawity @Alanこれは回避策として機能する場合がありますが、コマンドの実行後に新しいシェルを開くだけでなく、シェル内でコマンドを実行したいのです。
マシュー

+ 1、-tは間違いなく正しい方法です-i、私はそれを忘れました。
フレキソ

@matthew:bashそれを可能にするには、自分でパッチを適用する必要があります。
-grawity

@grawityではありません。以下の私の答えを参照してください
-fons

@マシュー、使用exec bashまたはexec $SHELL
Eugen

1

fonsの回答に関するコメントで、を使用している間は機能しないと言いますscreen

それについて詳しく説明していただけますか?opensshのソースコードを見ると、sshdは次を呼び出してコマンドを実行します。

YOUR_DEFAULT_SHELL -c COMMAND

そのため、たとえば、デフォルトのシェルがの場合、のフラグはそのをオーバーライドするだけなscreenので、これはそれほどうまくいきません。そのため、デフォルトのシェルである場合、コマンドを画面に送信する方法は実際にはありません。実際には、sshに与えられたコマンドとしてscreenを実行する必要がありますが、screen ではないデフォルトのシェルを使用しますscreen-c.scrreenrc

それがあなたがやろうとしていることなら、screen非インタラクティブなプログラムでウィンドウを閉じることになるので、物事は本当に奇妙になると思います。SO、例えば/ binに/ bashの、と(とない画面)をデフォルトのシェルとしてのような何か:

ssh user@host -t 'screen bash -l -c "ls;bash"'

ホストにsshし、深呼吸して、screenコマンドでbash -cを実行すると、新しいウィンドウが作成されます。このウィンドウがちょうどlsを開いた場合、ウィンドウは終了し、screenは終了するため、新しいscreen window内で fonsのトリックを使用します

それがあなたがやろうとしていたことさえあれば、私はそれがうまくいくと思う;)


screenこの状況での問題は、通常はexec screen -RRからロードすることだと思い.profileます。これは、bash -l画面を読み込もうとすると、残りの画面が表示されないことを意味します。あなたのソリューションと@fonsのソリューションの両方で '-l'を削除することで回避できそうです(あなたのソリューションではscreen)。それはちょっと奇妙です。
マシュー

0

複数の-tオプションは、sshにローカルttyがない場合でも、ttyの割り当てを強制します。

ssh -tt user@host 'bash -l -c "/path/to/command'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.