Şifreyi TTY'yi geçersiz kılmadan su / sudo / ssh dosyasına nasıl aktarabilirim?


148

Yapacak bir C Shell programı yazıyorum suveya sudoveya ssh. Hepsi parolalarını stdin veya komut satırı yerine konsol girişinde (TTY) istiyor.

Bir çözüm bilen var mı?

Şifresiz kurulum sudobir seçenek değildir.

bir seçenek olabilir, ancak soyulmuş sistemimde mevcut değil.



Yanıtlar:


215

Sudo için standart girişten şifreyi kabul etmek için bir -S seçeneği vardır. İşte adam girişi:

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

Bu, aşağıdaki gibi bir komut çalıştırmanıza izin verir:

echo myPassword | sudo -S ls /tmp

SSH'ye gelince, kullanımını otomatikleştirmek / kodlamak için birçok girişimde bulundum. Parolayı sormadan komuta geçirmenin yerleşik bir yolu yok gibi görünüyor. Diğerlerinin de belirttiği gibi, " bekle " yardımcı programı bu ikilemi ele almayı hedefliyor gibi görünüyor, ancak sonuçta, doğru özel anahtar yetkilendirmesini ayarlamak bunu otomatikleştirmeye çalışırken doğru yol.


2
Neyse ki, Ruby, şifreyi belirlemenizi sağlayan yerleşik bir SSH istemcisine sahiptir. Ruby -e "zorunlu 'net / ssh' gerektirir; Net :: SSH.start ('example.com', 'test_user',: password => 'secret') do | ssh | 'Başarıyla giriş yaptı'; cmd = alır; ssh.exec! (cmd); son sonu koyar "
user1158559

13
Burada parti oyuncusu olmaktan nefret ediyorum, ancak bunu yapmak şifrenizi bir işlem listesinde gösterebilir. Daha iyi bir yol belirlemeye çalışıyordum ve bu makaleye rastladım ve kimsenin işaret etmediğine şaşırdım. Harika bir çözüm, ancak risklere dikkat edin.
Matt

Ssh hakkında, bağlantı dizesinde şifre geçirmeyi denediniz mi? gibi nonroot:yourpassword@hostname.commi? Anahtar yetkilendirme ve anahtar yöneticisi kullanıyorsanız elbette işler çok daha kolay.
Killah

12
Bir dosyaya koyarak ve cat kullanarak işlem listesinde veya günlük dosyalarında görüntülenen parola kullanmaktan kaçının; 'cat pw | sudo -S <command>ve daha sonra rm pw.
CAB

Başka bir yol netcat kullanmak ve parolayı bir soket üzerinden teslim etmektir nc -l 12345 | sudo -S <command>. Gönderen tarafta; echo myPassord | nc <target> 12345. Bu sadece şifre işleme problemini taşır, ancak muhtemelen daha fazla seçeneğiniz olan bir ana konsola taşır.
CAB

36

Bir iletişim kutusu aracılığıyla parola isteyen bazı Applescript yazdım ve sonra böyle bir özel bash komutu oluşturur:

echo <password> | sudo -S <command>

Bunun yardımcı olup olmadığından emin değilim.

Eğer sudo önceden şifrelenmiş bir parolayı kabul etseydi iyi olurdu, bu yüzden betiğimde şifreleyebilir ve etraftaki açık metin şifrelerini yankılama konusunda endişelenmeyebilirim. Ancak bu benim ve durumum için işe yarıyor.


27

İçin sshkullanabilirsiniz sshpass: sshpass -p yourpassphrase ssh user@host.

Sadece önce sshpass'ı indirmeniz gerekiyor :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

12

Sahibim:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

Benim için çalışıyor.


Benim için çalışmadı. hala ssh parola ister.
AKS

Mükemmel, sonunda kullanabileceğim bir şey! Teşekkürler. Bunu ssh oturumu başlatan ve istemciye sudo komutları geçiren bir bash komut dosyası içinde kullanın. Benim script şu satırları çözmek için satır var: ssh -t kullanıcı adı @ hostname bash -c "sudo echo fartjuice"
James T Snell

12

Sudo için bunu da yapabilirsiniz:

sudo -S <<< "password" command

10

Bu sorunun olağan çözümü, süper kullanıcı erişimi gerektiren görevi gerçekleştiren bir yardımcı uygulama kullanmaktır: http://en.wikipedia.org/wiki/Setuid

Sudo çevrimdışı kullanılamaz.

Daha sonra düzenleme: SSH, özel-ortak anahtar kimlik doğrulaması ile kullanılabilir. Özel anahtarın parolası yoksa, ssh parola sorulmadan kullanılabilir.


10

Bu, bağlanacağınız hedef ana bilgisayarlara ortak / özel anahtarlar ayarlayarak yapılabilir. İlk adım, komut dosyasını yerel ana bilgisayarda çalıştıran kullanıcı için bir ssh anahtarı oluşturmak olacaktır:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

Ardından boş bir şifre girin. Bundan sonra, ssh anahtarınızı bağlanacağınız hedef ana bilgisayara kopyalayın.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

Ssh anahtarlarını kaydettikten sonra, ssh remote_user@other_hostyerel ana makinenizden bir sessizlik gerçekleştirebilirsiniz .


7

Belki bir expectkomut kullanabilirsiniz ? :

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

Bu komut şifreyi otomatik olarak verir.


Güzel görünüyor, ancak kök izinleri olmadan bir maschine üzerinde wait komutunu nasıl etkinleştirebilirim?
Radon8472

1
@ Radon8472 Yüklemek için izniniz yoksa ~ / bin dosyasına bir yürütülebilir dosya eklenebilir. Sisteminiz PATH'nize otomatik olarak ~ / bin eklemezse, bunu PATH = "$ PATH: ~ / bin" ile manuel olarak yapabilir veya bunu otomatik olarak yapmak için profilinize ekleyebilirsiniz. PATH'inizi değiştirmek istemiyorsanız, komutu mutlak yolunu kullanarak yürütebilirsiniz: ~ / bin /
wait

6

Daha iyi bir seçim olmadığında (başkaları tarafından önerildiği gibi), insan sosyeti yardımcı olabilir:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

Tüm pty, setid, ctty karmaşıklığı gereklidir ve uzun süre uyumamanız gerekmesine rağmen uyumanız gerekecektir. Echo = 0 seçeneği, ssh'ın komut satırındaki uzak komutu geçirirken de görülmeye değer.


1
Bu aslında işe yarayacaktır su. su-S (stdin) seçeneği yoktur.
aus

Uykudan kaçınmak ve onun yerine daha güvenilir bir şey kullanmak mümkün mü?
Michael Pankov

6

Şuna baksana expectLinux yardımcı programına .

Stdin'deki basit desen eşleşmesine dayalı olarak stdio'ya çıktı göndermenizi sağlar.


1

SSH'yi Anahtar üzerinde parola olmadan Genel Anahtar Kimlik Doğrulaması için ayarlayın. Ağdaki kılavuz yükleri. O zaman giriş yapmak için şifreye ihtiyacınız olmayacak. Daha sonra istemci ana bilgisayar adına bağlı olarak bir anahtarın bağlantılarını sınırlandırabilirsiniz. Makul güvenlik sağlar ve otomatik girişler için harikadır.


1
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

Ssh anahtarıyla kullanıcı olarak oturum açabiliyorsanız, sudo erişimi iyidir: ssh -t user @ host "echo mypassword | sudo -S sudocommand"
Jack

0

Ben de aynı problemi yaşadım. uzak bilgisayarda dizin oluşturmak için iletişim komut dosyası. ssh ile iletişim kurmak kolaydır. Sshpass kullanıyorum (önceden kurulmuş).

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

Almanya'dan selamlar

titus


0

@ Jahid'in cevabına dayanarak, bu benim için macOS 10.13'te çalıştı:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

0

daha iyi bir sshpassalternatif: passh https://github.com/clarkwang/passh

Uzak sunucuda oturum açma

 $ passh -p password ssh user@host

Uzak sunucuda komut çalıştırma

 $ passh -p password ssh user@host date

şifreyi geçirmek için diğer yöntemler

-p Parola (Varsayılan: `parola ')

-p env: env var'dan şifreyi oku

-p dosyası: Parolayı dosyadan oku

burada neden sshpass ve diğer çözümlerden daha iyi olduğunu açıkladım.


-1
echo <password> | su -c <command> <user> 

Bu işe yarıyor.


1
Fedora'da benim için çalışan tek kişi bu. İnsanlar durumlarında çalışmadığı için cevapları küçümsüyorlar mı?
Hangchen Yu

2
"su: bir terminalden çalıştırılmalıdır" (RPi1B, Raspbian)
notme1560

Ne yazık ki bu, stdio'dansu şifre okuyan son sürümlerinde geçerli değildir .
moutonjr

-1

Bekleme komut dosyasında bir parolayı sabit olarak kodlamak, sudo en azından komutlarını günlüğe kaydettiğinden, aslında daha kötü olan, şifresiz bir sudo'ya sahip olmakla aynıdır.



-1

KULLANIM:

echo password | sudo command

Misal:

echo password | sudo apt-get update; whoami

Umarım yardımcı olur..


-2

Betiği beklemek için parametre olarak parola sağlayabilirsiniz.


-11
su -c "Command" < "Password"

Umarım faydalıdır.


1
Değil. Bunun cevabı "su: bir terminalden çalıştırılmalıdır" dır.
thelogix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.