Paramiko: вызов команды "cd" с помощью exec_command ничего не делает

У меня есть следующая программа, использующая Paramiko:

#!/usr/bin/env python

import paramiko

hostname = '192.168.1.12'
port = 22
username = 'root'
password = 'whatl0ol'

if __name__ == "__main__":
    paramiko.util.log_to_file('paramiko.log')
    ssh = paramiko.SSHClient()
    ssh.load_system_host_keys()
    ssh.connect(hostname, port, username, password)             

while True:
      pick = raw_input("sshpy: ")
      stdin, stdout, stderr = ssh.exec_command(pick)
      print stdout.readlines() 

Но когда я подключаюсь и пытаюсь использовать cdне работает Как я могу это исправить?

2 ответа

Похоже, что вы реализуете какую-то интерактивную программу, которая позволяет выполнять последовательность команд на сервере.

SSHClient.exec_command выполняет каждую команду в отдельном канале "exec". Отдельные команды работают в своей среде. Так что если вы выполните cd команда, это никак не влияет на последующие команды. Они снова начнут в домашнем каталоге пользователя.

Если вы хотите реализовать интерактивную сессию оболочки. использование SSHClient.invoke_shell,
Например, посмотрите, как взаимодействовать с сеансом интерактивной оболочки Paramiko?

См. Также Выполнение нескольких команд в Paramiko, чтобы на команды влияли их предшественники.

Paramiko SSH_Client открывает новый сеанс и выполняет команду в этом сеансе, и после выполнения команды канал сеанса закрывается.

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

Если вы хотите провести сеанс, используйте invoke_shell для интерактивного сеанса.

Мне нужно было сменить каталоги и запустить исполняемый файл. Я должен сделать все в одной команде. Клиентский модуль был машиной с Windows 10. Оболочка cmd в Windows очень проблематична! Команды разные. ';' между командами не работает. Вам нужно использовать '&'. cd d:/someDirectory не работает. Вам нужен '/d'. "pwd" не работает. Кроме того, echo%cd% to pwd не работает надежно. cd без параметров для pwd работает надежно. Я надеялся, что список неработающих сэкономит вам время. Вот где он приземлился.

cmd = 'cd /d D:\someDirectory & SomeExecutable.exe 
      someParameter'
ssh_stdin, ssh_stdout, ssh_stderr = 
ssh.exec_command(cmd_1_to_execute)

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

cmd = 'cd /d D:\someDirectory & cd'
ssh_stdin, ssh_stdout, ssh_stderr = 
ssh.exec_command(cmd_1_to_execute)

output = ssh_stdout.readline()
error = ssh_stderr.readline()
print("output: " + output)
print("error: " + error)
Другие вопросы по тегам