ssh üzerinde sudo için uygun bir yol


150

Sudo kullanarak uzak bir sunucuda SSH üzerinden başka bir komut dosyası çalıştıran bir komut dosyası var. Ancak, şifreyi yazdığımda, terminalde görünür. (Aksi takdirde iyi çalışır)

ssh user@server "sudo script"

Yazarken şifre görünmeden SSH üzerinden sudo için parola yazabilmek için bunu yapmanın doğru yolu nedir?


2
Bana gelince, ssh ile sudoing bir yol aramanın nedeni, hatayla karşılaştığım gibi ssh <user@server> sudo <script>, böyle bir şey denerken çalışmadığıydısudo: no tty present and no askpass program specified
knocte

Yanıtlar:


244

Başka bir yol, -tanahtarı şu amaçlarla kullanmaktır ssh:

ssh -t user@server "sudo script"

Bkz man ssh:

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g., when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

2
Güzel, -t seçeneğini biliyordum, sadece sudo istemleri için çalıştığını bilmiyordum.

3
-t seçeneği ne için?
Vince


3
Burada çalışmıyor: ssh -t localhost <<< "sudo touch file;"EDIT Görünüşe göre komutu standart olarak değil (parametre anlamlıdır) bir parametre olarak sağlamanız önemlidir.
Sınırlı Kefaret

-tYöntem ayrıca, normal olarak bunun komutları renkli çıkışı gösterir.
karmakaze

24

Aşağıdaki komutla tamamen otomatikleştirebildim:

echo pass | ssh -tt user@server "sudo script"

Avantajları:

  • şifre istemi yok
  • uzak makine bash geçmişinde şifre gösterilmeyecek

Güvenlikle ilgili olarak : Kurt'un dediği gibi, bu komutu çalıştırmak parolanızı yerel bash geçmişinizde gösterecektir ve parolayı farklı bir dosyaya kaydetmek veya tüm komutu bir .sh dosyasına kaydetmek ve yürütmek daha iyidir. NOT: Yalnızca izin verilen kullanıcıların dosyaya erişebilmesi için dosyanın doğru izinlere sahip olması gerekir.


8
Parola dahil olmak üzere yerel sistemin bash geçmişinde görünecektir. Parolayı bir dosyada saklamak ve dosyaya kedi eklemek daha iyidir.
Kurt Fitzner

4
Dostum, biliyordum -t, ama kılavuzu iki kez geçebileceğini görecek kadar dikkatli okumadım! Aylardır aradığım şey bu ! Bir güvenlik eki olarak, sadece çalıştırmadan önce bir şifre değişkeni ayarladım read -s -p "Password: " pw, sonra yaptım echo "$pw" | ..... Şimdi bunu kendim için kullanışlı bir senaryoya dönüştürdüm :).
kael

Benim için cazibe gibi çalıştı!
MiKr13

Neden çalıştırmanız gereken belirli kullanıcılar ve komutlar için şifresiz sudo ayarlamıyorsunuz? Bu bir SSH sorunu değil ...
nomen

@nomen çözümünüz de geçerlidir, ancak ek adımlar gerektirir. Şifresiz bir sudo kullanıcısı olmayan çok fazla cihazım varsa, bu çözümü kullanarak bir otomasyon komut dosyası oluşturabilirim. Bazen sahip olmadığınız bir sistem üzerinde çalışıyorsunuz ve değişiklik yapmak istemiyorsunuz ya da yapamıyorsunuz, bazen başka hususlar da var.
ofirule

6

Şifre istemi istemediğinizi varsayarsak :

ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'

Misal

ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'

14
Düz metin parola komut satırına geldiğinden bu / çok / tehlikelidir. Komut satırları herkese açıktır ve sistemdeki diğer tüm kullanıcılar ve işlemler tarafından görülebilir. Örneğin, ayrıcalıksız bir kullanıcı tarafından "ps auxwwwww" çalışan her işlemi ve bunları çalıştıran komut satırlarını gösterir.
Kurt Fitzner

3
Parolanızı (düz metin olarak) bash_history dosyasına yerleştirmekten bahsetmiyorum bile.
Layne Bernardo

4

Bir şifre geçen SSH üzerinden sudo, tty gerekmez:

Sudo üzerinde sudo üzerinden ssh'yi, sudo'ya etkileşimli bir parola gerektirmemesini ve stdin'den parola almasını söyleyerek sözde (ssh "-t" anahtarını kullanmadan) kullanmaya zorlamadan kullanabilirsiniz. Bunu sudo'daki "-S" anahtarını kullanarak yaparsınız. Bu, sudo'yu stdin'de parolayı dinletir ve yeni satır gördüğünde dinlemeyi durdurur.

Örnek 1 - Basit Uzaktan Komut

Bu örnekte, basit bir whoamikomut göndeririz :

$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root

Sudo'ya bilgi istemediğini ve girdisini stdin'den almamasını söylüyoruz. Bu, sudo şifresini tamamen sessiz hale getirir, böylece geri aldığınız tek yanıt çıktıdır whoami.

Bu teknik, kendilerini stdin girişi gerektiren sudo üzerinden sudo üzerinden program çalıştırmanıza izin verme avantajına sahiptir. Bunun nedeni sudo'nun stdin'in ilk satırı boyunca parolayı tüketmesi ve daha sonra çalıştırdığı programın stdin'i yakalamaya devam etmesidir.

Örnek 2 - Kendi stdin'ini Gerektiren Uzaktan Komut

Aşağıdaki örnekte, "cat" uzak komutu sudo üzerinden yürütülür ve uzak kedinin görüntülenmesi için stdin aracılığıyla bazı ekstra satırlar sağlıyoruz.

$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

Çıktı, <remote_sudo_password>hattın sudo tarafından tüketildiğini ve uzaktan yürütülen kedinin ekstra satırları gösterdiğini gösterir.

Bunun faydalı olacağına bir örnek, komut satırını kullanmadan ayrıcalıklı bir komuta şifre geçirmek için ssh kullanmak istiyorsanız. Diyelim ki, ssh üzerinden uzak şifreli bir kapsayıcı bağlamak istiyorsanız.

Örnek 3 - Uzak VeraCrypt Kabı Takma

Bu örnek komut dosyasında, bir VeraCrypt kapsayıcısını sudo aracılığıyla ek bilgi metni olmadan uzaktan monte ediyoruz:

#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF

Yukarıdaki tüm komut satırı örneklerinde (komut dosyası dışındaki her şeyde) << EOFkomut satırındaki yapının, parola dahil olmak üzere her şeyin yerel makinenin .bash_history dosyasına kaydedilmesine neden olacağı unutulmamalıdır . Bu nedenle, gerçek dünya kullanımı için ya tamamen yukarıdaki bir veracrypt örneği gibi bir komut dosyası aracılığıyla kullanmanız ya da komut satırında parolayı bir dosyaya koymanız ve bu dosyayı ssh üzerinden yönlendirmeniz önerilir.

Örnek 1a - Yerel Komut Satırı Parolası Olmayan Örnek 1

İlk örnek böylece:

$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root

Örnek 2a - Yerel Komut Satırı Parolası Olmayan Örnek 2

ve ikinci örnek:

$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

Komut dosyasının içeriği geçmişinizde bulunmadığından, her şeyi bir komut dosyasına koyarsanız, parolayı ayrı bir dosyaya koymak gereksizdir. Yine de, parolayı görmemesi gereken kullanıcıların komut dosyasını yürütmesine izin vermek istemeniz durumunda yine de yararlı olabilir.


Ssh remote komutunda, catsonuçları sudo'ya neden yürütmeniz ve aktarmanız gerekiyor? Sadece sudoana ssh uzaktan kumandası olarak kullanılabilir mi?
joanpau

@joanpau İlk catkullanıcı şifresini diğer taraftaki sudo'ya bağlamak için kullanılır. Kullanıcı sudo'yu parola olmadan çalıştırabilirse, gerekli değildir, ancak bu yapılandırmayı önermiyorum. Borunun nedeni, uzak sistem sunucusunun komut satırında parolanın görünmesini önlemektir. Komut satırları güvenli değildir, herhangi bir kullanıcı her komut satırını görebilir ps auxwww.
Kurt Fitzner

Ben catssh komutunda istiyorum cat \| sudo --prompt="" -S.... Eğer -Sgüçler sudoşifreyi stdin'den okuyacaksa, kedi ve boru gerekli midir? Ssh komutu basitçe olabilir sudo --prompt="" -S...mi?
joanpau

@jonpau O kedi komutu stdin alıyor ve sudo parolasını geçmek için sudo aracılığıyla kullanıyor. Sudo şifresini sdin üzerinden stdin ile nasıl güvenli bir şekilde kullanabileceğinizi gösteriyor.
Kurt Fitzner

1

En iyi yol, ssh -t user@server "sudo <scriptname>"örneğin ssh -t user@server "sudo reboot". Önce kullanıcı için sonra da root için parola isteyecektir (komut dosyasını veya komutu root ayrıcalığı ile çalıştırdığımız için).

Umarım şüphe uyandırmıştır.



0
echo $VAR_REMOTEROOTPASS | ssh -tt -i $PATH_TO_KEY/id_mykey $VAR_REMOTEUSER@$varRemoteHost 
echo \"$varCommand\" | sudo bash

2
... ve lütfen kodunuz için bir açıklama sağlayın.
pppery

-1

Bir sorunla karşılaştım,

user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt

Output:
sudo: no tty present and no askpass program specified

Sonra denedim

#1
vim /etc/sudoers
Defaults:user1    !requiretty

çalışmadı

#2
user1   ALL=(user2)         NOPASSWD: ALL

düzgün çalıştı!


Bu gerçekten sorulan şeyi başaramaz. Fikir yine de parola istemek, ancak ssh üzerine yazılmasına izin vermektir. Yaptığınız sadece user1'e şifre olmadan user2'ye tam sudo erişimi verildi. Bu, belirli uygulamalar için iyidir, ancak genel bir çözüm olarak en iyi fikir değildir.
Possum

-7

Kullanımınıza bağlı olarak, aşağıdakilerle başarılı oldum:

ssh root@server "script"

Bu, root şifresini soracak ve komutu doğru şekilde çalıştıracaktır.


26
Yikes, SSH kök olarak? Her türlü nedenden dolayı bu kötü bir fikir.
darkfeline

12
Unutmayın, ssh telnet değildir. Kök kadar ssh'ı başka bir kullanıcı olarak ssh ve sudo çalıştırmaktan daha tehlikeli değildir. Parolanız ssh bağlantısı üzerinden aynı şekilde şifrelenir.
Stéphane

22
Stéphane şifre güvenliği konusunda kesinlikle doğrudur. Ancak, sudo yerine root kullanarak sudo ile birlikte gelen denetim yolunu kaybedersiniz. Ayrıca, kök erişimi kullanılamayabilir.
djeikyb
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.