2011-06-07 14 views
12

:sudo paramiko ile nasıl çalıştırılır? Ben denedim ne (Python)

  1. invoke_shell() sonra su, sonra şifre root olmama sonuçlandı göndermek channel.send
  2. invoke_shell() sonra Kanal Kapalı hatası
  3. sonuçlandı channel.exec_command daha sonra kök
  4. invoke_shell olmayan sonuçlandı channel.exec_command
  5. _transport.open_session()() daha sonra stdin'e yazmak ve kök olmayan sonuçlandı temizleme
+0

Neden setuid http://en.wikipedia.org/wiki/Setuid? "sudo: Hiçbir tty mevcut ve belirtilen hiçbir askpass programı" senin sudoer olsa şifredir, bu –

cevap

17

onay bu örnek üzerinden:

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 

Örnek fazla açıklamalarla burada bulunabilir: http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

yardımcı olur Umut!

+2

çalışmaz: stdin, stdout stderr = –

+1

Tamam, verilen bağlantıyı riskable yorum yukarıdaki sorunu çözer ssh.exec_command ("sudo -S% s"% komutu) # Stdout hala açıksa, sudo stdout.channel.closed öğesi yanlışsa parolasının sorulmasını sağlar. Hata: stdin.write ('% s \ n '% password] stdin.flush() –

+0

hala çalışıyor mu?Benim için hiçbir şey yapmıyor –

0

Aklımda, daha fazla haklara sahip bir betik oluşturmak çok daha kolay ve güvenli olacaktır.

Örneğin, sudoers Bu ekleyin:

myuser ALL=NOPASSWD:/home/myuser/somescript.sh 

Şimdi sadece ana makinede paramiko ile komut çağırabilirsiniz ve onunla yapılabilir.

+0

Sudoers'ı düzenlemek için root olarak (ya da 'su' |' sudo' kullanın) ve sudoer'ları düzenleyelim ya da betiği çalıştıralım. Uzaktaki sisteme sadece 'paramiko' ile ulaşırsanız zor veya imkansız olabilirim. Örneğin, bir şeyi otomatikleştiriyorsunuz, komut dosyalarınız için her bir ana bilgisayarı manuel olarak hazırlamak istemezsiniz. – Jury

+0

Bu, yüksek güvenlik riski olduğundan çoğu durumda bir seçenek değildir. –

4

invoke_shell böyle benim için çalıştı:

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) 
+0

Bu '' 'değil döngü '' hile yaptı! Paylaşım için teşekkürler! :) –

+0

Bu işe yaramaz, getpass da güvenli değil, çünkü şifre int tarihini gösterir – TechJS

2

Im i ayrıntıları cevap ama this tavsiye

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) 
2
You Can use channel to send sudo password: 

    passwd = getpass.getpass() 
    ssh = paramiko.client.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.client.AutoAddPolicy()) 
    ssh.load_system_host_keys() 
    ssh.connect(host, allow_agent=True) 
    chan = ssh.get_transport().open_session() 
    chan.get_pty() 
    chan.setblocking(1) 

    chan.exec_command("sudo -k dmesg") 

    while chan.recv_ready()==False: 
     stdout=chan.recv(4096) 
     if re.search('[Pp]assword', stdout): 
      chan.send(passwd+'\n') 
     time.sleep(1) 

    while chan.recv_ready(): 
     stdout += chan.recv(20000) 
    chan.close() 
    ssh.close()de here 
0

kullanarak paramiko üzerinde sudo komutlarını uygulamak başardı için zamanım yok özür AlexS İnce ayarlı yanıt (şu anda bunu üretimde kullanıyorum):

def sudo_run_commands_remote(command, server_address, server_username, server_pass, server_key_file): 
    ssh = paramiko.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(hostname=server_address, 
       username=server_username, 
       password=server_pass, 
       key_filename=server_key_file) 
    session = ssh.get_transport().open_session() 
    session.set_combine_stderr(True) 
    session.get_pty() 
    session.exec_command("sudo bash -c \"" + command + "\"") 
    stdin = session.makefile('wb', -1) 
    stdout = session.makefile('rb', -1) 
    stdin.write(server_pass + '\n') 
    stdin.flush() 
    print(stdout.read().decode("utf-8")) 

Bir anahtar dosyası kullanmıyorsanız ve bunun aksine yalnızca parolayı anahtar kullanmıyorsanız, bölümünü kaldırın.

Bu konuyla ilgili bazı notlar, çok komut yeteneğine sahip olmasıdır. Anlamı, 'u root olarak çalıştırıyor, böylece tek bir işlemde ; ile ayırarak olabildiğince çok komut alabilirsiniz.

İlgili konular