web-dev-qa-db-ja.com

Paramikoを使用してディレクトリを変更するにはどうすればよいですか?

DramコマンドがParamikoを使用して実行されない

Paramikoを使用して受信する永続的なエラーメッセージに関する上記の質問を投稿しました。次の質問とは関係ないと思いますが、そうかもしれません。

Paramikoを使用してSSH経由でサーバーに正常に接続できます。 lsやpwdなどのコマンドを実行できます。私ができないように見えるのは、ディレクトリを変更することです。たとえば、「cd ..」というコマンドを送信できますが、「pwd」でフォローアップすると、ディレクトリを変更していないことがわかります。ログインしたときの最初のディレクトリが表示されます。

>>> stdin, stdout, stderr = myssh.exec_command("pwd")
>>> stdout.readlines()
['/big/dom/home/myid\n']
>>> stdin, stdout, stderr = myssh.exec_command("cd ../")
>>> stdout.readlines()
[]
>>> stdin, stdout, stderr = myssh.exec_command("pwd")
>>> stdout.readlines()
['/big/dom/home/myid\n']
>>>

ここで何が起こっているのか誤解していますか?ディレクトリを変更できませんか?または、可能であれば、exec_commandを使用する以外の方法で行う必要がありますか?

39
Mike Ryan

この男はそれを理解しました: http://www.vertigrated.com/blog/2010/02/python-remote-ssh-with-paramiko/

次のような1つのexec_commandで複数のコマンドを送信する必要があります。

myssh.exec_command('cd ..; pwd')

次に、stdout.readlines()は、変更したディレクトリを返します。

38
Mike Ryan

バージョン2.6以降、SFTPClientを使用する場合、ディレクトリを変更するメソッドはsftp = myssh.open_sftp() sftp.chdir('path/to/directory')です。

6
jarriett

ParamikoはShellのインスタンスを作成し、paramikoで実行するすべてのコマンドはShellのそのインスタンスでのみ指定する必要があります。

例:私がいるディレクトリにフォルダがあるとします。

folder1
folder2
folder3

フォルダ1にcdしてディレクトリを作成したい場合は、次のようにします。

ssh.exec_command('cd folder1;mkdir folder4')

次のように書くと:

ssh.exec_command('cd folder1')
ssh.exec_command('mkdir folder4')

あなたは次のような結果を得るでしょう

folder1
folder2
folder3
folder4

これらはシェルの2つの異なるインスタンスであり、それらの機能は独立しています。

6
Aklank Jain

これには少し遅れますが、「invoke_Shell」してファイルを介して標準入力に書き込むことは可能です。

ご覧ください: https://stackoverflow.com/a/6203877/186135

';'。join(cmdlist)を実行してexec_commandに送信できるため、少し重いようです。

2
CodeMode