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再認証する必要はありません。

答え2

Geekosaurはあなたができることを正確に指摘しています。参照としてアンパサンドを渡す、(likeを使用してエスケープすることもできますscript eclipse \&)しかし、ここではより良いアプローチを提案することができます。パスワードを使用して別のシステムにSSHで接続し、コマンドを実行するExpectスクリプトを作成したようです。

これは、実用的な観点とセキュリティの観点の両方でそれほど良い解決策ではないことに注意してください。実際、全体的な状況は脆弱であり、いくつかの潜在的な状況がクラッシュする可能性があり、デバッグプロセスが乱雑になる可能性があります。セキュリティの観点からはそうです。クレイジー他のコンピュータのシステムパスワードがテキストファイルのどこかに保存されているからです!

より良い方法があります!この問題を解決するために、キーベースの認証が構築されました。パスワードなしで認証するには、キーペア(ある部分はサーバー上にあり、もう一方はクライアント上にあります)を作成します。これにより、Expectを使用せずにパスワードをどこにも保存せずにスクリプトでsshを実行できます。追加の手順として、パスワードでローカルキーを暗号化し、エージェントまたはキーリングマネージャを使用してキーを使用する必要があるスクリプトを実行する前に、シェルにキーをロードすることもできます。

編集する:公開鍵認証が使えないから見たかったです。これはクレイジーな話です。要件を見逃して、スクリプトがハッキングであることに気付かなかった読者の利益のために答えを残します。 :)

答え3

参照の使用: script 'eclipse &'いいえ$argvスクリプトの参照expectは他の規則に従いますsh。 )

関連情報