sudo mit SSH auf remote hosts

Mit SSH lassen sich Kommandos direkt auf entfernten Rechnern ausführen. Werden für das Kommando die Rechte des Superusers benötigt (und man kann sich nicht direkt als root anmelden), kann in den meisten Fällen sudo nicht sofort helfen.

$ ssh host "sudo mycommand"
sudo: sorry, you must have a tty to run sudo

Aus Sicherheitsgründen ist bei den meisten Linux-Distributionen in der Konfiguration von sudo mit ‘requiretty’ das Vorhandensein einer Terminal-Sitzung verpflichtend, wie sie auch nach einer Anmeldung mittels SSH besteht.

# grep requiretty /etc/sudoers
Defaults requiretty

Im Fall des mit SSH übermitteln Kommandos findet jedoch üblicherweise keine tty-Belegung statt. Forcieren kann man eine pseudo-tty allocation mit dem Parameter -t in SSH und dann funktioniert auch sudo bei der Kommandoübergabe mit SSH.

$ ssh -t hostname "sudo mycommand"

Bug: Network-Manager speichert PPP-Einstellungen nicht

Die aktuelle Version des network-manager (network-manager-gnome: 0.7~~svn20081020t000444-0ubuntu1) in Ubuntu 8.10 speichert nicht die PPP-Einstellungen für Mobile Broadband-Verbindungen. Welche Änderungen auch gemacht werden, die Software schreibt undefinierte Werte nach gconf.

Mit dem gconf-editor kann man die Werte manuell setzen. In /system/networking/connections/NUMMER/ppp) werden bei Änderungen im network-manager die keys mit undefinierten Werten geschrieben, die man dann selbst setzen muss.

GET / im Terminal

Da staunte ich eben nicht schlecht als meine telnet-Session abbrach und das Kommando GET / im Terminal ausgeführt wurde. Als Ausgabe wurde ein HTML-formatiertes ls -1a / zurückgegeben.

$ telnet example.com 80
Trying 208.77.188.166...
GET /
telnet: Unable to connect to remote host: Connection timed out
$ GET /
<HTML>
<HEAD>
<TITLE>Directory /</TITLE>
<BASE HREF="file:/">
</HEAD>
<BODY>
<H1>Directory listing of /</H1>
<UL>
<LI><A HREF="./">./</A>
<LI><A HREF="../">../</A>
<LI><A HREF=".rnd">.rnd</A>
<LI><A HREF="aquota.group">aquota.group</A>
<LI><A HREF="aquota.user">aquota.user</A>
<LI><A HREF="bin/">bin/</A>
<LI><A HREF="boot/">boot/</A>
<LI><A HREF="dev/">dev/</A>
<LI><A HREF="etc/">etc/</A>
<LI><A HREF="home/">home/</A>
<LI><A HREF="initrd/">initrd/</A>
<LI><A HREF="lib/">lib/</A>
<LI><A HREF="media/">media/</A>
<LI><A HREF="mnt/">mnt/</A>
<LI><A HREF="opt/">opt/</A>
<LI><A HREF="proc/">proc/</A>
<LI><A HREF="root/">root/</A>
<LI><A HREF="sbin/">sbin/</A>
<LI><A HREF="srv/">srv/</A>
<LI><A HREF="sys/">sys/</A>
<LI><A HREF="tmp/">tmp/</A>
<LI><A HREF="usr/">usr/</A>
<LI><A HREF="var/">var/</A>
</UL>
</BODY>
</HTML>

Des Rätsels Lösung war schnell gefunden und ernüchternd. GET ist ein symbolischer Link auf lwp-request, das benutzt werden kann, um Anfragen an WWW-Server und das lokale Dateisystem zu senden.

$ ls -l `which GET`
lrwxrwxrwx 1 root root 11 2008-11-02 21:09 /usr/bin/GET -> lwp-request