Форум сайта python.su
Доброго всем времени суток! “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
Офлайн
Попробуй “sudo -S cp /home/crontab /etc/”
Отредактировано (Май 25, 2011 12:12:10)
Офлайн
1. Посмотри Fabric.
2. Входи обычным пользователем.
3. Настрой sudoers так, что бы этот пользователь мог выполнять нужную команду (cp /home/crontab /etc/foo) от рута (sudo) без указания пароля.
С Fabric работало, как будет с Paramiko не знаю.
..bw
Офлайн
Еще вариант - сразу заходить root-ом :)
В программе “sudo -s” и “cp /home/crontab /etc/” запускаются в разных сессиях (каналах), причем параллельно. При этом “pass\n” передается на вход именно “cp …”, а не sudo.
Офлайн
> 3. Настрой sudoers так, что бы этот пользователь мог выполнять нужную команду (cp /home/crontab /etc/foo) от рута (sudo) без указания пароля.
вариант хороший, но для этого нужно сначала на всех 150 машинах настроить sudoers
> Еще вариант - сразу заходить root-ом
если рут по shh доступен, то и входить не надо, можно выполнить команду удаленно: ssh root@host cp /home/crontab /etc/foo
а если по всем машинам раскидать доверительные ключи, то ввод пароля не понадобится.
Офлайн
> а если по всем машинам раскидать доверительные ключи, то ввод пароля не понадобится.
кстати пароль можно указать команде ssh параметром.
итого: если root по ssh доступен, то копирование можно выполнить одно командой с локальной машины, без всяких питонов.
Офлайн
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)
Офлайн
Перенаправление вывода не попадает под sudo, поэтому просто не хватает прав. Нужно спрятать “>>” примерно так:
stdin, stdout, stderr = client.exec_command("""sudo -S sh -c "echo '59 23 * * * root /sbin/shutdown -P now' >> /etc/crontab" """)
Офлайн
agalen
Спасибо! Помогло! Не догадался засунуть еще глубже… ;)
Офлайн
В фабрик с sudo ничего нет, он вообще для другого и если мне не изменяет память основан на парамико. Для судо в парамико можно использовать invoke_shell() или можно использовать pexpect.
Офлайн