Как мне изменить каталоги, используя Paramiko? - PullRequest
36 голосов
/ 20 января 2012

Команды Drush, не выполняющиеся с использованием Paramiko

Я разместил вышеупомянутый вопрос относительно постоянного сообщения об ошибке, которое я получаю с использованием Paramiko.Я не думаю, что это связано с моим следующим вопросом, но это может быть.

Я могу успешно подключиться к своему серверу через SSH, используя Paramiko.Я могу выполнять команды, такие как 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?

Ответы [ 4 ]

36 голосов
/ 30 июля 2012

Этот парень понял, что: http://www.vertigrated.com/blog/2010/02/python-remote-ssh-with-paramiko/

Вам просто нужно отправить несколько команд одной командой exec_command, например:

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

Затем stdout.readlines () вернетсякаталог, который вы изменили.

5 голосов
/ 18 мая 2017

Начиная с версии 2.1+, метод для изменения каталогов: sftp.chdir('path/to/directory')

4 голосов
/ 01 сентября 2017

Итак, paramiko создает экземпляр оболочки, и все команды, которые вы хотите выполнить в paramiko, должны быть заданы только в этом экземпляре оболочки.

Например: допустим, у меня есть какая-то папка вкаталог, в котором я нахожусь.

folder1
folder2
folder3

Теперь, если я хочу перейти в папку 1 и создать там каталог, то я бы сделал следующее:

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

, если вы напишите его следующим образом:

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

вы получите результат, подобный

folder1
folder2
folder3
folder4

, так как это два разных экземпляра оболочки и они будут независимы по своим функциям.

2 голосов
/ 01 июля 2014

Немного опоздал с этим, но можно вызвать invoke_shell и записать в стандартный ввод через файл.

Пожалуйста, смотрите: https://stackoverflow.com/a/6203877/1861353

Кажется немного тяжелым, поскольку вы можете просто ';'. Join (cmdlist) и отправить в exec_command.

...