ExpectとSSHを介してバックグラウンドフラグ(&)を渡す

ExpectとSSHを介してバックグラウンドフラグ(&)を渡す

私のコマンドライン/bash fuはかなり弱いですが、私の能力を磨くために努力しています。誰かが助けることができることを願っています。

私は職場で使用されているヘッドレスボックスにSSHを接続すると同時にパスワードを送信できる非常に簡単なexpectスクリプトを作成しました(拡張できない理由で公開鍵を使用してロギングを自動化することはできません)。スクリプト:

#!/usr/bin/expect -f
set timeout 30
spawn ssh -X ***@10.101.0.133 $argv
match_max 100000
expect "*?assword:*"
send -- "***\r"
interact

ボックスにはすでに開発者環境があり、Eclipseがインストールされています。ほとんどの場合、ボックスにアーカイブされたいくつかのコードを処理するためにEclipseに直接トンネルすることになるので、一般的にscript eclipse

&作成中のSSHセッションのパラメータとして&シンボルを処理するために予想されるフラグをどのように渡すことができますか?私がそれを使用するときにリモートコンピュータで作業を実行するのではなく、私のコンピュータでバックグラウンドスクリプトを実行しますが、Eclipseがリモートコンピュータで起動してもコンピュータのシェルを使用できるように送信できるようにしscript eclipse &たいです。&script

これはおそらく本当に愚かな質問です。しかし、どんな助けでも大変感謝します。

修正する:私はアンパサンドを避ける方法を見つけました(明らかに「うるさい」瞬間でした…ええ)。しかし、これは新しい問題を引き起こす。スクリプトに引数を渡すと、渡されたコマンドが実行されると、期待コマンドは対話を許可しないようです。 SSHセッションが終了します。私はこれが期待の制限ではなくSSH動作の一部だと思います。それでも答えてくれてありがとう。

アップデート2:子孫のために、スクリプトを次のように変更して目的の動作を得ました。

#!/usr/bin/expect -f
set timeout 30
spawn ssh -X ***@10.101.0.133
match_max 100000
expect "*?assword:*"
send -- "***\r"
send $argv
send -- "\r"
interact

ベストアンサー1

パスワードを入力する必要がない場合は、次のことができます。

ssh -t 'eclipse & exec bash'

この-tフラグは、コマンド名を指定しても ssh に端末を割り当てるように指示します。リモートシェルはコマンドを実行するため、非対話型である必要がありますが、最後に実行されることは、対話型の新しいシェルインスタンスにexec bash自分自身を置き換えることです。 (あなたのお気に入りのシェルと交換してくださいbashzsh

パスワードを入力する必要がある場合は、端末にパスワードを入力する必要があります(expectこれがその部分を自動化する場合はパスワードが必要な理由です)。sshコマンドライン引数またはファイルからパスワードの読み取りを意図的に拒否します。

便利な方法の1つは、基本的なSSH接続を一度に作成してピギーバックすることです。マスターサーバーが稼働している間は、認証を必要としないスレーブサーバー接続を確立できます。次の行~/.ssh/config:

Host nickname
HostName 10.101.0.133
ControlPath=~/.ssh-control:%l:%p:%r

デフォルトの接続を作成しますssh -MX nickname eclipseexpectパスワードを自動的に転送したい場合)。これにより、Eclipseの実行中にssh nickname再認証する必要はありません。

おすすめ記事