Распределение парамико и псевдо-tty - PullRequest
21 голосов
/ 26 мая 2010

Я пытаюсь использовать Paramiko для подключения к удаленному хосту и выполнения ряда замен текстовых файлов.

i, o, e = client.exec_command("perl -p -i -e 's/" + initial + "/" 
                              + replaced + "/g'" + conf);

Некоторые из этих команд необходимо запускать как sudo, что приводит к:

sudo: извините, вы должны иметь tty для запустить sudo

Я могу принудительно назначить псевдо-tty с помощью ключа -t и ssh.

Можно ли сделать то же самое, используя парамико?

Ответы [ 4 ]

36 голосов
/ 04 февраля 2015

На самом деле все довольно просто. Просто:

stdin, stdout, stderr = client.exec_command(command,  get_pty=True)
22 голосов
/ 30 сентября 2011

У меня работает следующий код:

#!/usr/bin/env python
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('localhost',username='root',password='secret')
chan = ssh.get_transport().open_session()
chan.get_pty()
chan.exec_command('tty')
print(chan.recv(1024))

Это было собрано из просмотра нескольких примеров в Интернете ... не уверен, что это "правильный" способ.

14 голосов
/ 26 мая 2010

Я думаю, что вам нужен метод invoke_shell объекта SSHClient (я бы хотел дать URL, но документы paramiko на lag.net имеют большой размер кадра и просто не будут показать мне конкретный URL для данного места в документах) - он дает вам Channel, на котором вы можете сделать exec_command и т.п., но делает это через псевдо-терминал (в комплекте с типом терминала и номерами строк и столбцов! -) кажется, что вы просите.

7 голосов
/ 26 августа 2014

Согласно справочной странице sudo:

Опция -S (stdin) заставляет sudo читать пароль со стандартного ввода вместо оконечного устройства. за паролем должен следовать символ новой строки.

Вы можете записать в stdin, потому что это файловый объект с write ():

import paramiko

client = paramiko.client.SSHClient()
client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
client.connect(hostname='localhost', port=22, username='user', password='password')
stdin, stdout, stderr = client.exec_command('sudo -S aptitude update')
stdin.write('password\n')
stdin.flush()
# print the results
print stdout.read()
client.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...