ssh での Bash のようなコマンド置換、または ssh *クライアント* から要求する方法は?

ssh での Bash のようなコマンド置換、または ssh *クライアント* から要求する方法は?

bash (および他のシェル) では、$() や `` (バッククォート) などを使用して、コマンドの結果をコマンド ラインに挿入できます。

さて、SSH セッション用にそのようなものがあればいいのですが。SSH セッション中に、自分のコンピューターから何らかの情報が必要になり、接続先のマシンの内部コマンド ラインにその情報を入力したいとします。

たとえば、mysql コンソールに直接アクセスしたいとします。次のようなコマンドを使用できます。

ssh [email protected] "mysql -u blub -pmypass"

それは動作しますが、問題は、ssh シェル プロセスのコマンド ラインでパスワードが表示されることです。

このセキュリティ問題を解決するには、次のような方法が必要です。

ssh [email protected] "mysql -u blub -p\$(ssh-on-client 'cat pass-file')"

cat passfileこれはサーバーではなく ssh クライアントで実行されます。そのようなことは知られていますか? それを実行するための他のトリックはありますか?

更新: 私の例を参考にした回答はありがたいのですが、本当の質問に答えるものでない限りは受け入れません。つまり、SSH セッション内から SSH クライアント コンピュータと通信できるかどうかです。(これがセキュリティ上の問題になる可能性があることは承知しています)

可能な解決策:

  • クライアント上に接続するための ssh サーバーを用意します。(sweimann) 問題は、サーバーに接続するための資格情報を取得する方法です。
  • ssh を使用してトンネルを作成し、netcat スクリプト/telnet を使用してサーバー上でコマンドを実行し、結果を送り返します。
  • expect を使用してシェルをスクリプト化します。(Zac Thompson)
  • クライアント上の ssh のカスタム ラッパーを使用して、コンソールを監視し、それに応じてアクションを実行します。(札幌)
  • これをサポートするにはSSHにパッチを当ててください。メーリングリストに同様のパッチがあります。利用可能
  • 「SendEnv」オプションがありますsshリモート コンピュータの環境変数を設定します。ただし、リモート sshd でこれを有効にする必要があります。

答え1

使いたい期待するこれには、おそらくすでにあなたのマシンにインストールされているでしょう。これは、あらゆる種類の対話型コマンドライン自動化の標準ツールです。これは Tcl ライブラリなので、途中で Tcl スキルを無料で習得できます。注意してください。中毒性があります。

#!/path/to/expect
spawn ssh [email protected] "mysql -u blub"
expect "*ssword:*"
send -- "mypass\r"
interact

答え2

< を使用してみてください。

ssh[メールアドレス]"mysql -u blub -p" < ファイル

「ファイル」の最初の行がパスワードである場合、パスワードプロンプトにはそのパスワードが使用され、残りは SQL 部分に使用されます。

リモート サーバーで SQL ファイルを実行するだけの場合は、次を試してください。

ssh[メールアドレス]"mysql -u blub -p < file.sql" < パスワード

答え3

私は数年前から根本的な問題を調べてきました。SSH セッション内から SCP ダウンロードを開始したいと考えていました。あなたの問題と同様に、これには SSH セッション内からクライアント上の何らかのプロセスへの通信が必要です。

そこで、3 つ目の解決策として、SSH のラッパーを使用して接続する方法があります。SSH の出力をスキャンし、パターンを認識すると特定のコマンドをローカルでトリガーします。明らかにハックですが、うまくいくかもしれません。

私は最終的に、SSH接続を記憶する/usr/bin/scriptの修正版を作成しました(例:me@somehost)。そして、私のsshセッションが を印刷するたびに###/some/absulte/path/to/file/on/host.txt###、ローカルで実行されます。scp me@somehost:/some/absulte/path/to/file/on/host.txt .

シンプルなシェル スクリプトを使用して、サーバー上のパターンと絶対パスを簡単に生成しました。

(私のコードは実際にはもう少し多くのことを行いました。ダウンロードしたファイルに対してローカル テキスト エディターを開き、ファイルが変更されたときに SCP を使用して再アップロードします。コードが必要な場合はお知らせください。)

それ以来、私はこれのより良い実装を探してきましたが、今のところ見つけていません。

おそらく、このテクニックは、SSH のラッパーではなく、SSH プロキシ コマンド (connect.c など) として実装できるでしょう。

答え4

ターミナルセッションをエミュレートする必要があります:

ssh -t [email protected] "mysql -u blub -p"

この場合、暗号化された SSH チャネルを介してネットワークを移動するパスワードが求められますが、コンソールには表示されません。

関連情報