ssh経由でリモートシェル上で複数のコマンドを実行するプログラム(Windows 7のPython 3.x)を書きたいと思います。 paramikosのexec_command()関数を見た後、コマンドが環境変数に依存する(以前のコマンドで設定されている)ので、使用できないプログラム中の異なる時刻に実行されるので、1つのexec_command()呼び出しに連結されます。Paramikoを使ってPythonでsshを使って対話型シェルを実装しますか?
このように、私は同じチャネルでコマンドを実行したいです。私はに見えた次のオプションがparamikos使用して対話型シェルを実行してinvoke_shell()関数:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=psw, port=22)
channel = ssh.invoke_shell()
out = channel.recv(9999)
channel.send('cd mivne_final\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
channel.send('cd ..\n')
channel.send('cd or_fail\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
channel.send('cd ..\n')
channel.send('cd simulator\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
ssh.close()
をこのコードのいくつかの問題があります。
- は、最初の 『印刷』は必ずしも印刷を行います'ls'出力(ときどき2番目の 'print'にのみ出力されます)。
- 最初の 'cd'と 'ls'コマンドは常に出力にあります(出力の一部として 'recv'コマンドで取得します)。次の 'cd'と 'ls'コマンドはすべてときどき印刷され、ときどき印刷されないことがあります。
- 2番目と3番目の 'cd'と 'ls'コマンド(印刷時)は常に最初の 'ls'出力の前に表示されます。
私はこの「非決定主義」と混同し、あなたの助けに非常に感謝します。私は基本的にすべてのコードを使用して、ちょうどループのために追加している
これは実際にはPythonコードであると仮定して、少数のフォロワーとタグをPythonタグで置き換えると、より多くの助けになるでしょう。がんばろう。 – shellter
'paramiko'を使う必要がありますか?私は 'ファブリック 'で作業するほうがはるかに簡単だと分かった。 'user'、' password'、 'host_string'のような' env'変数を設定してから、リモートホストからファイルをダウンロードする '' get''や ''ファイルを送る ''や ''実行するコマンドを発行する。 'run( 'cd .. && cd simulator && ls')'のようにコマンドをチェーンすることができます。 – kchomski
@kchomski残念ながら、fabricはpython 3.xと互換性がないので、オプションではありません。とにかく、私が見たものから、Fabricはparamikoへのラッパーに過ぎず、同じチャンネルで「非連鎖」コマンドを実行させません。最終的にシェルコマンドの間で実行したいと思うロジックがたくさんあります。 – misha