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
Пример найден здесь с дополнительными пояснениями: http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-Different/
Надеюсь, поможет!
Ответ 2 · рейтинг 7 · seelaman
invoke_shell работал у меня так:
import paramiko, getpass, re, time
ssh_client = paramiko.SSHClient()
ssh_client.connect( host )
sudo_pw = getpass.getpass("sudo pw for %s: " % host)
command = "sudo magicwand"
channel = ssh_client.invoke_shell()
channel.send( command )
# wait for prompt
while not re.search(".*\[sudo\].*",channel.recv(1024)): time.sleep(1)
channel.send( "%s\n" % sudo_pw )
Ответ 3 · рейтинг 5 · AmirHossein
AlexS Точно настроенный ответ (который я сейчас использую в производстве):
Удалите часть key_filename метода connect, если вы не используете файл ключа, и, напротив, если вы используете только ключ без пароля, удалите часть password.
Некоторые примечания по этому поводу заключаются в том, что он поддерживает несколько команд. Это означает, что выполняется bash как root, поэтому вы можете выполнять столько команд, сколько можете, за один запуск, просто разделяя их с помощью ;.
Ответ 4 · рейтинг 2 · AlexS
Извините, у меня нет времени на подробный ответ, но я смог реализовать команды sudo на paramiko, используя это советовать
import paramiko
l_password = "yourpassword"
l_host = "yourhost"
l_user = "yourusername"
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(l_host, username=l_user, password=l_password)
transport = ssh.get_transport()
session = transport.open_session()
session.set_combine_stderr(True)
session.get_pty()
#for testing purposes we want to force sudo to always to ask for password. because of that we use "-k" key
session.exec_command("sudo -k dmesg")
stdin = session.makefile('wb', -1)
stdout = session.makefile('rb', -1)
#you have to check if you really need to send password here
stdin.write(l_password +'\n')
stdin.flush()
for line in stdout.read().splitlines():
print 'host: %s: %s' % (l_host, line)
Ответ 5 · рейтинг 2 · Aashutosh jha
Вы можете использовать канал для отправки пароля sudo:
На мой взгляд, было бы намного проще и безопаснее создать скрипт с правами sudoer.
Например, добавьте это в sudoers:
myuser ALL=NOPASSWD:/home/myuser/somescript.sh
Теперь вы можете просто вызвать скрипт через paramiko на хост-компьютере и покончить с этим.
Ответ 7 · user9603539
Мне удалось запустить команду sudo cupsdisable на удаленном сервере вручную без необходимости вводить пароль, когда я вхожу на этот сервер как один из администраторов (не root), но когда я выполняю то же самое с помощью stdin, stdout, stderr = client.exec_command("sudo cupsdisable <Printqueuename>") это ничего не делает.