SSH: sudo komutunu çalıştır


44

Etkileşimli bir kabuk betiğim var, bir yerde başka bir makineye ssh (Ubuntu tabanlı) ve kök olarak bir şey yürütmesi gerekiyor (kullanıcı şifresini girmelidir, ancak uzak komut komut dosyasında belirtildiği gibi çalışmalıdır):

# ...
ssh remote-machine 'sudo ls'
# ...

Ancak, her zaman bu hata iletisini geri alıyorum:

sudo: no tty present and no askpass program specified

Tamam, bu oldukça açık. Fakat bunu nasıl aşabilirim? Böyle bir şey olmalı:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var

Yanıtlar:


52

Harika sshher şeyin bir tedavisi vardır. Önemli olan, -tssh'yi sahte bir tty ayırmaya zorlamak için bayrağı eklemek.

ssh -t remote-server 'sudo ls'

1
Bununla birlikte, PTY'ler işleri komut dosyalarıyla karıştırabilir. lsçıkış, örneğin \ r \ n sonları içerecektir.
Tobu

1
Bunun kolay yolu, ls'yi terminal dışı moda zorlamaktır. ls | catyapacağım - göreceksiniz ki stdout bir pipo. Bu özel soruda, bir terminalden etkileşimli olarak çalıştırılmak istendiği için konuyla ilgisi yoktur - bu nedenle muhtemelen sütunların ve renklerin olmasını istersiniz.
Gabe

0

Bu yöntem ssh'den sonra sudo kullanarak tek bir komut dosyasını çalıştıracaktır:

Sudo özelliklerine sahip bir "uzak" kullanıcımız olduğunu ve root olarak çalıştırılmasını istediğimiz bir betik olduğunu varsayalım.

1) Oturum açma sırasında kullanılacak / etc / passwd içinde bir komut dosyası ayarlayın :

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2) "login.sh" içinde, "sudo" olarak çalıştırmak istediğimiz betiği uygularız:

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

Normalde şifreyi iki kere sorar: ssh login + sudo. Sadece bir kez girmek istiyorsanız, şifre olmadan sudo deneyin (önerilmez). <- lütfen Boldewyn yorumunu okuyun.

Ana avantaj, "ssh" nin başka herhangi bir parametre (-t) gerektirmemesi ve sudo'nun sunucu tarafında zorlanmasıdır. Ayrıca, komut dosyası çıktıktan sonra, kullanıcı da oturumu kapattı.

O kadar zarif olmayabilir, ama basit ve çalışır.


Ahh. Uzaktaki kullanıcınızı sudoersböyle bir sunucuya dosyaya koymak, gerçekleşmeyi bekleyen bir felakettir. Herhangi biri kullanıcı olarak erişim kazanırsa (örneğin, web sunucusu aracılığıyla), derhal kökleşebilir. Teşekkürler, fakat sunucu konfigürasyonumuzu zorlamayan çözümler arıyordum. Çözüme sahip olsaydınız, sudokomut için SSH'den kimlik doğrulamasını sihirli bir şekilde yeniden kullanırsa, daha fazla ilgilenirdim (ve belki de SSH için değiştirmeleri aramaya başlayacağım ...).
Boldewyn

@Boldewyn: evet, "şifresiz sudo" ayarının güvenlik riski var ... isteğe bağlı bir adım. Size katılıyorum, eğer SSH kimlik doğrulamayı tekrar kullanabilirse, bu tür bir "çözüm" gerekli olmazdı. Yorumun için teşekkürler.
lepe

-1

Etkileşim olmadan root erişimi almak için aşağıdaki komutu kullanabilirsiniz:

ssh server " sudo command" < sudopassword.txt

1
Bu işe yaramaz çünkü stdin bir terminal cihazı olmayacaktır (belirtilen dosyadan okunacaktır).
Anthony G - Monica adaleti,
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.