A NullReferenceException
бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.
Например:
string str = string.Empty;
str.ToLower(); // throw null reference exception
Public Class Person {
public string Name { get; set; }
}
Person objPerson;
objPerson.Name /// throw Null refernce Exception
Полное распределение paramiko поставляется с большим количеством хороших демонстраций .
В поддиректории demos demo.py
и interactive.py
есть полные интерактивные примеры TTY, которые, вероятно, будут
В вашем примере выше ssh_stdin
действует как стандартный файловый объект Python, поэтому ssh_stdin.write
должен работать, пока канал все еще открыт.
I «Мне никогда не приходилось писать в stdin, но в документах предполагается, что канал закрыт, как только выйдет команда, поэтому использование стандартного метода stdin.write
для отправки пароля, вероятно, не будет работать. На самом канале есть команды paramiko более низкого уровня, которые дают вам больше контроля - см., Как метод SSHClient.exec_command
реализован для всех деталей gory.
У меня была та же проблема, что и попытка сделать интерактивный сеанс ssh с использованием ssh , fork of Paramiko.
Я выкопал и нашел эту статью:
http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/
Чтобы продолжить свой пример, вы могли бы сделать
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("psql -U factory -d factory -f /tmp/data.sql")
ssh_stdin.write('password\n')
ssh_stdin.flush()
output = ssh_stdout.read()
В статье более подробно описывается полностью интерактивная оболочка вокруг exec_command. Я нашел это намного проще в использовании, чем примеры в источнике.
Вам нужен Pexpect, чтобы получить лучшее из обоих миров (ожидать и ssh-обертки).
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(server_IP,22,username, password)
stdin, stdout, stderr = ssh.exec_command('/Users/lteue/Downloads/uecontrol-CXC_173_6456-R32A01/uecontrol.sh -host localhost ')
alldata = ""
while not stdout.channel.exit_status_ready():
solo_line = ""
# Print stdout data when available
if stdout.channel.recv_ready():
# Retrieve the first 1024 bytes
solo_line = stdout.channel.recv(1024)
alldata += solo_line
if(cmp(solo_line,'uec> ') ==0 ): #Change Conditionals to your code here
if num_of_input == 0 :
data_buffer = ""
for cmd in commandList :
#print cmd
stdin.channel.send(cmd) # send input commmand 1
num_of_input += 1
if num_of_input == 1 :
stdin.channel.send('q \n') # send input commmand 2 , in my code is exit the interactive session, the connect will close.
num_of_input += 1
print alldata
ssh.close()
Почему stdout.read () будет зависать, если использовать dierectly, не проверяя stdout.channel.recv_ready (): while, в то время как stdout.channel.exit_status_ready ():
Для моего случая, после run на удаленном сервере, сеанс ожидает ввода пользователем, после ввода «q» он закроет соединение. Но перед вводом «q» stdout.read () будет ожидать EOF, кажется, что этот метод не работает, если буфер больше.
Я не знаком с paramiko, но это может работать:
ssh_stdin.write('input value')
ssh_stdin.flush()
Для получения информации о stdin:
http://docs.python.org /library/sys.html?highlight=stdin#sys.stdin
Взгляните на пример и сделайте аналогичным образом
(sorce from http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely- другой / ):
ssh.connect('127.0.0.1', username='jesse',
password='lol')
stdin, stdout, stderr = ssh.exec_command(
"sudo dmesg")
stdin.write('lol\n')
stdin.flush()
data = stdout.read.splitlines()
for line in data:
if line.split(':')[0] == 'AirPort':
print line