Уведомления

Группа в Telegram: @pythonsu

#1 Май 24, 2011 10:53:10

ezoom
От:
Зарегистрирован: 2011-05-24
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаленное исполнение bash команд

Доброго всем времени суток! “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. Или может есть иной способ решить задачу? Подскажите, сильные мира сего!



Офлайн

#2 Май 25, 2011 12:06:43

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Удаленное исполнение bash команд

Попробуй “sudo -S cp /home/crontab /etc/”



Отредактировано (Май 25, 2011 12:12:10)

Офлайн

#3 Май 25, 2011 17:08:57

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Удаленное исполнение bash команд

1. Посмотри Fabric.
2. Входи обычным пользователем.
3. Настрой sudoers так, что бы этот пользователь мог выполнять нужную команду (cp /home/crontab /etc/foo) от рута (sudo) без указания пароля.

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

..bw



Офлайн

#4 Май 25, 2011 17:39:27

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Удаленное исполнение bash команд

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

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



Офлайн

#5 Май 26, 2011 06:04:17

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Удаленное исполнение bash команд

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

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

Офлайн

#6 Май 26, 2011 06:08:14

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Удаленное исполнение bash команд

> а если по всем машинам раскидать доверительные ключи, то ввод пароля не понадобится.
кстати пароль можно указать команде ssh параметром.

итого: если root по ssh доступен, то копирование можно выполнить одно командой с локальной машины, без всяких питонов.

Офлайн

#7 Май 26, 2011 14:37:25

ezoom
От:
Зарегистрирован: 2011-05-24
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаленное исполнение bash команд

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
Подскажите как быть.



Отредактировано (Май 26, 2011 14:38:53)

Офлайн

#8 Май 27, 2011 09:33:23

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Удаленное исполнение bash команд

Перенаправление вывода не попадает под sudo, поэтому просто не хватает прав. Нужно спрятать “>>” примерно так:

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



Офлайн

#9 Май 27, 2011 12:23:49

ezoom
От:
Зарегистрирован: 2011-05-24
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаленное исполнение bash команд

agalen
Спасибо! Помогло! Не догадался засунуть еще глубже… ;)



Офлайн

#10 Июнь 2, 2011 10:28:12

evilempirer
От:
Зарегистрирован: 2010-06-07
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаленное исполнение bash команд

В фабрик с sudo ничего нет, он вообще для другого и если мне не изменяет память основан на парамико. Для судо в парамико можно использовать invoke_shell() или можно использовать pexpect.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version