2017-03-15 13 views
2

私はsubprocessモジュールをPython 2.7.6で使用してSSHを確立しました。これはお勧めできませんが、paramikoやfabricなどのPython SSHライブラリをインストールすることはできません。PythonのサブプロセスからSSHにコマンドを渡す方法

誰かがちょうど私がサブプロセスアプローチとREMOTEでコマンドを実行する方法を、私は今について

sshProcess = subprocess.call(['ssh', '-t', '<REMOTE>', 'ssh', '<REMOTE>']) 

を行くだろう私に言って気にしないならば私は思っていました。これを行う方法はありますか?残念ながら、REMOTEは、ユーザーが手動で入力するパスワードによって保護されています。役立つなら、Windows 10のBashシェルを実行しています。

何か助けていただければ幸いです。

+0

最低でも、あなたは 'を区別する必要があります'と' 'です。 'COMMAND'を構築する方法も重要です。一定のコマンドを実行するのではなく変数に代入する場合は、セキュリティの問題があります。 –

+0

...あなたのタイトルはあなたの質問は「コマンドを渡す方法」だと言っていますが、パスワードを渡すしか方法がわからないことは現在明らかです。あなたがしようとしていること*再実行する:実行するリモートコマンドを形成すること、そしてそれがいかに失敗するかが重要です。 –

+0

Pythonプログラムがユーザーがいて、インタラクティブにパスワードを入力できるTTYから実行されているかどうかは重要です。 –

答えて

1

リモートコマンドを実行するのは、コマンドラインで実行するのと同じくらい簡単です。 (これはプロトコルレベルのSSHサーバーとstdinで区別されますが、問題のプロトコルはプログラマティックな使用のために構築されていますが、人間のために構築されています - 後者はインタラクティブシェルモデルの背後にある設計意図でした) 。

ところで

あなたは一度だけ認証した後に、単一の接続を介して別々のSSHの呼び出しを経由して複数のコマンドを実行したい場合は、私は強く、このためParamikoを使用してお勧めしますが、 OpenSSHのコマンドラインでそれを行うことができますツールを使用してSSH multiplexing support


のは、あなたのリモートコマンドを表す配列を持っているとしましょう:

myCommand = [ 'ls', '-l', '/tmp/my directory name with spaces' ] 

文字列にそれを取得するには(スペースを尊重し、悪意を持って、選択した名前の実行を任せることはできない方法で、リモートサーバー上で任意のコマンド)、あなたが使用したい:

:今

myCommandStr = ' '.join(pipes.quote(n) for n in myCommand) 

を、あなたは、SSHへのコマンドライン引数として渡すことができる何かを持っています

subprocess.call(['ssh', '-t', hostname, myCommandStr]) 

ただし、これをネストしたいとします。あなただけのプロセスを繰り返すことができます:SSHは、パスワードのプロンプトを実行することができるはずですので

myCommand = [ 'ssh', '-t', hostname1, myCommandStr ] 
myCommandStr = ' '.join(pipes.quote(n) for n in myCommand) 
subprocess.call(['ssh', '-t', hostname2, myCommandStr]) 

我々は標準入力や標準出力をリダイレクトしていないので、彼らはまだ、あなたのPythonプログラムが起動された端末で指摘されなければなりません直接。

特に
暫定システムを通じてssh'ingについて、あなたはこのくらいの手間を通過する必要はありません 、言っ

:あなたはProxyJumpオプションを使用して、あなたのためにその仕事をするためにsshを伝えることができます。

myCommand = [ 'ls', '-l', '/tmp/my directory name with spaces' ] 
myCommandStr = ' '.join(pipes.quote(n) for n in myCommand) 
subprocess.call(['ssh', '-o', 'ProxyJump=%s' % hostname1, hostname2, myCommandStr]) 
0

あなたのコメントから、あなたは接続できると言います。だから後に、あなたのようなものが必要になりますサブプロセスを使用してSSH経由で対話するために:リストディレクトリのように、コマンドを送信し、その後

ssh = subprocess.Popen(['ssh', <remote client>], 
          stdin=subprocess.PIPE, 
          stdout = subprocess.PIPE) 
back = ssh.stdout.readlines() 
if result == []: 
    error = ssh.stderr.readlines() 
    print error 
else: 
    print back 

を、何かのように:

ssh.stdin.write("ls\n") 
+0

'ssh.stdout.readlines()'はstdoutが終了しない限り永遠にハングします(後で読むことはできません)。 –

+0

...また、このルートに行くということは、SSHプロセスが(パイプラインで上書きしているので)TTYにハンドルがなくなったことを意味します。したがって、パスワードを直接要求することはできません。 –

+0

ああ、それは、私はそれを編集します –

関連する問題