Найти - Пользователи
Полная версия: Удаленное исполнение bash команд
Начало » Python для новичков » Удаленное исполнение bash команд
1 2
ezoom
Доброго всем времени суток! “I'm new in python” ;)

Есть задача: раскидать на более чем 150 одинаково настроенных ПК (Ubuntu 10.04) файлик в /etc. Естесственно для этого нужны права рута…

Погуглив, собрал вот такой код.

#!/usr/bin/python  
import sys
import paramiko
import termios
def sshpipe(host, line) :
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("ip",username="user",password="pass")
stdin, stdout, stderr = client.exec_command("sudo -s")
stdin, stdout, stderr = client.exec_command("cp /home/crontab /etc/")
stdin.write('pass\n')
stdin.flush()
output = stdout.read()
sys.stdout.write(output)
stdin.close()
stdout.close()
stderr.close()
client.close()
sshpipe(sys.argv[0], sys.argv[0])
На это другая сторона отвечает:

May 24 11:43:01 pc079 sshd[12770]: Accepted password for user from IP port 48669 ssh2
May 24 11:43:01 pc079 sshd[12770]: pam_unix(sshd:session): session opened for user user by (uid=0)
May 24 11:43:01 pc079 sudo: user : no tty present and no askpass program specified ; TTY=unknown ; PWD=/home/user ; USER=root ; COMMAND=/bin/bash
May 24 11:43:01 pc079 sshd[12770]: pam_unix(sshd:session): session closed for user user
Отсюда вопрос: как же получить доступ к tty после выполнения sudo. Или может есть иной способ решить задачу? Подскажите, сильные мира сего!
agalen
Попробуй “sudo -S cp /home/crontab /etc/”
bw
1. Посмотри Fabric.
2. Входи обычным пользователем.
3. Настрой sudoers так, что бы этот пользователь мог выполнять нужную команду (cp /home/crontab /etc/foo) от рута (sudo) без указания пароля.

С Fabric работало, как будет с Paramiko не знаю.

..bw
agalen
Еще вариант - сразу заходить root-ом :)

В программе “sudo -s” и “cp /home/crontab /etc/” запускаются в разных сессиях (каналах), причем параллельно. При этом “pass\n” передается на вход именно “cp …”, а не sudo.
o7412369815963
> 3. Настрой sudoers так, что бы этот пользователь мог выполнять нужную команду (cp /home/crontab /etc/foo) от рута (sudo) без указания пароля.
вариант хороший, но для этого нужно сначала на всех 150 машинах настроить sudoers

> Еще вариант - сразу заходить root-ом
если рут по shh доступен, то и входить не надо, можно выполнить команду удаленно: ssh root@host cp /home/crontab /etc/foo
а если по всем машинам раскидать доверительные ключи, то ввод пароля не понадобится.
o7412369815963
> а если по всем машинам раскидать доверительные ключи, то ввод пароля не понадобится.
кстати пароль можно указать команде ssh параметром.

итого: если root по ssh доступен, то копирование можно выполнить одно командой с локальной машины, без всяких питонов.
ezoom
agalen
Спасибо - помогло. Но задача изменилась и одновременно усложнилась. Заменять /etc/crontab - оказалось грубым приемом, т.к. на некоторых ws уже есть нестандартные задания. Необходимо дописать в crontab строку задания :/ В целях безопасности, удаленная авторизация root'ом отключена - не вариант логиниться им.
bw
Буду курить Fabric может есть там чего…
o7412369815963
Если бы было все так просто…

что имеем сейчас
#!/usr/bin/python
import sys
import paramiko
import termios
import pexpect
def sshpipe(host, line) :
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("192.168.2.97",username="name",password="pass")
stdin, stdout, stderr = client.exec_command("sudo -S echo '59 23 * * * root /sbin/shutdown -P now'")
stdin.write('pass\n')
stdout.read = stdin
stdin.flush()
output = stdin
stdin.close()
stdout.close()
stderr.close()
client.close()
sshpipe(sys.argv[0], sys.argv[0])
на клиенте имеем

ay 26 15:03:51 pc097 sshd[11459]: Accepted password for USER from 192.168.2.97 port 36646 ssh2
May 26 15:03:51 pc097 sshd[11459]: pam_unix(sshd:session): session opened for user USER by (uid=0)
May 26 15:03:51 pc097 sshd[11459]: pam_unix(sshd:session): session closed for user USER
May 26 15:03:51 pc097 sudo: USER : TTY=unknown ; PWD=/home/user ; USER=root ; COMMAND=/bin/echo 59 23 * * * root /sbin/shutdown -P now
т.е. все гуд
Но при замене

stdin, stdout, stderr = client.exec_command("sudo -S echo '59 23 * * * root /sbin/shutdown -P now'")
на

stdin, stdout, stderr = client.exec_command("sudo -S echo '59 23 * * * root /sbin/shutdown -P now' >> /etc/crontab")
имеем

May 26 15:29:28 pc097 sshd[11719]: Accepted password for USER from 192.168.2.97 port 49454 ssh2
May 26 15:29:28 pc097 sshd[11719]: pam_unix(sshd:session): session opened for user USER by (uid=0)
May 26 15:29:28 pc097 sshd[11719]: pam_unix(sshd:session): session closed for user USER
Подскажите как быть.
agalen
Перенаправление вывода не попадает под sudo, поэтому просто не хватает прав. Нужно спрятать “>>” примерно так:

stdin, stdout, stderr = client.exec_command("""sudo -S sh -c "echo '59 23 * * * root /sbin/shutdown -P now' >> /etc/crontab" """)
ezoom
agalen
Спасибо! Помогло! Не догадался засунуть еще глубже… ;)
evilempirer
В фабрик с sudo ничего нет, он вообще для другого и если мне не изменяет память основан на парамико. Для судо в парамико можно использовать invoke_shell() или можно использовать pexpect.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB