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)