Как изменить каталоги с помощью Paramiko?
Команды 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?
Ответы
Ответ 1
Этот парень понял: http://www.vertigrated.com/blog/2010/02/python-remote-ssh-with-paramiko/
Вам просто нужно отправить несколько команд с помощью одного exec_command, например:
myssh.exec_command('cd ..; pwd')
Затем stdout.readlines() вернет каталог, который вы изменили.
Ответ 2
Начиная с версии 2.1+, метод изменения каталогов
sftp.chdir('path/to/directory')
Ответ 3
Ну парамико создает экземпляр оболочки, и все команды, которые вы хотите выполнить в paramiko, должны быть предоставлены только в этом экземпляре оболочки.
Например:
Скажем, у меня есть папка в каталоге, в котором я находится.
folder1
folder2
folder3
Теперь, если я хочу записать cd в папку 1 и создать каталог, я бы сделал это:
ssh.exec_command('cd folder1;mkdir folder4')
если вы напишете его так:
ssh.exec_command('cd folder1')
ssh.exec_command('mkdir folder4')
вы получите результат, например
folder1
folder2
folder3
folder4
поскольку это были два разных экземпляра оболочки и были бы независимы в их функции.
Ответ 4
Немного поздно с этим, но его можно "invoke_shell" и записать на стандартный ввод через файл.
Пожалуйста, смотрите:
fooobar.com/info/173908/...
Кажется немного тяжеловесом, так как вы можете просто ";" присоединиться к (cmdlist) и отправить команду exec_command.