この質問には少し文脈があります。私は、ファイル/フォルダーをあるマシンから別のマシンにコピーするアプリケーションをPythonで作成しています。接続は複数のマシンを通過できる必要があります。私は文字通りマシンを直列に接続しているので、正しいマシンに到達するまでそれらをホップする必要があります。
現在、python のsubprocessモジュール (Popen) を使用しています。私が持っている非常に単純な例として
import subprocess
# need to set strict host checking to no since we connect to different
# machines over localhost
tunnel_string = "ssh -oStrictHostKeyChecking=no -L9999:127.0.0.1:9999 -ACt machine1 ssh -L9999:127.0.0.1:22 -ACt -N machineN"
proc = subprocess.Popen(tunnel_string.split())
# Do work, copy files etc. over ssh on localhost with port 9999
proc.terminate()
私の質問: このようにすると、エージェント転送が機能しないように見えます。これは、このような場合に不可欠です。これを行う方法はありますか?
Popen で shell=True キーワードを使用してみました
tunnel_string = "eval `ssh-agent` && ssh-add && ssh -oStrictHostKeyChecking=no -L9999:127.0.0.1:9999 -ACt machine1 ssh -L9999:127.0.0.1:22 -ACt -N machineN"
proc = subprocess.Popen(tunnel_string, shell=True)
# etc
これの問題は、マシンの名前がユーザー入力によって与えられることです。つまり、悪意のあるシェル コードを簡単に挿入できることを意味します。2 つ目の問題は、接続を確立するたびに新しい ssh-agent プロセスが実行されることです。
私のbashrcには、すでに実行中のssh-agentsを識別し、適切な環境変数を設定してsshキーを追加する素晴らしい機能がありますが、もちろん、サブプロセスは私のbashrcで定義された関数を参照できません。Popen で shell=True を使用して executable="/bin/bash" 変数を設定しようとしましたが、役に立ちませんでした。