fragen stichworte

Fedora, SSH und Sudo

Ich muss ein Skript auf mehreren Fedora -Maschinen über ssh remote ausführen. Da das Skript root -Privilegien erfordert, mache ich Folgendes:

$ ssh me@remost_host "sudo touch test_sudo" #just a simple example
sudo: no tty present and no askpass program specified

Die entfernten Maschinen sind so konfiguriert, dass das Kennwort für Sudo nie abgefragt wird. Für den obigen Fehler besteht die häufigste Lösung darin, ein Pseudo-Terminal mit der Option -t in ssh:

zuzuordnen
$ ssh -t me@remost_host "sudo touch test_sudo"
sudo: no tty present and no askpass program specified

Versuchen wir, diese Zuweisung mit -t -t:

zu erzwingen
$ ssh -t -t me@remost_host "sudo touch test_sudo"
sudo: no tty present and no askpass program specified

Nein, es funktioniert nicht.

In /etc/sudoers habe ich natürlich diese Zeile:

#Defaults    requiretty

... aber ich kann nicht manuell auf mehreren Remote-Computern ändern.

Fehlt mir hier etwas? Gibt es eine einfache Lösung?

BEARBEITEN:

  • Hier ist die Sudoers-Datei eines Hosts, auf dem ssh me@host "sudo stat ." funktioniert.
  • Hier ist die Sudoers-Datei eines Hosts, auf dem es nicht funktioniert.

EDIT 2: Ausführen von tty auf einem Host, auf dem es funktioniert:

$ ssh  me@host_ok tty
not a tty

$ ssh -t me@host_ok tty
/dev/pts/12
Connection to host_ok closed.

$ ssh -t -t me@host_ok tty
/dev/pts/12
Connection to host_ok closed.

Nun auf einem Host, auf dem es nicht funktioniert:

$ ssh me@host_ko tty
not a tty

$ ssh -t me@host_ko tty
not a tty
Connection to host_ko closed.

$ ssh -t -t me@host_ko tty
not a tty
Connection to host_ko closed.

BEARBEITEN 3 Berechtigungen für/dev/tty * auf einem Computer, auf dem das obige nicht funktioniert hat:

$ stat/dev/tty*
  File: `/dev/tty'
  Size: 0           Blocks: 0          IO Block: 4096   character special file
Device: fd02h/64770d    Inode: 17089401    Links: 1     Device type: 5,0
Access: (0666/crw-rw-rw-)  Uid: (    0/   root)   Gid: (    0/   root)
Access: 2013-12-11 11:44:01.000000000 +0000
Modify: 2013-12-11 11:44:01.000000000 +0000
Change: 2014-01-20 15:43:36.000000000 +0000

EDIT 4

Ok, also im /var/log/ habe ich folgendes:

$ ls/var/log 
btmp  lastlog  maillog  messages  secure  spooler  sudo  tallylog  wtmp  yum.log

Ich habe es mit messages und secure versucht, aber sie sind leer. sudo enthält dagegen etwas ... das einzige Problem ist, dass dieselbe Protokollmeldung angezeigt wird, unabhängig davon, ob ich -t, -t -t oder nichts verwende:

Jun  4 17:38:52 : my_username : no tty present and no askpass program
    specified ; TTY=unknown ; PWD=/home/my_username ; USER=root ;
    COMMAND=/usr/bin/stat .

antworten

versuchen Sie dies:

ssh root@remote_host "sed -ibak s/requiretty/\!requiretty//etc/sudoers"

ODER noch besser:

echo 'Defaults:me !requiretty' > me
scp me root@remote:/etc/sudoers.d/
ssh me@remote whatever

* Einmaliges Anmelden mit Root ist erforderlich, jedoch *

Erstens denke ich, dass Sie die Dinge wahrscheinlich falsch angehen.

  • Wenn Sie Dutzende von Remote-Computern ausführen und ähnliche Aufgaben bei vielen von ihnen ausführen müssen, und sich darüber Sorgen machen, dass Sie Konfigurationsänderungen nicht manuell vornehmen können, dann ist es an der Zeit für Sie Verwenden Sie das Konfigurationsmanagement. ZB Puppet oder Chef sind die Standard-Optionen. Oder vielleicht Ansible, die auf den Zielmaschinen weniger Installation zu tun hat. Ansible ist jedoch am ehesten mit dem gleichen Problem konfrontiert.

  • Wenn Sie mit Ihrem aktuellen Ansatz fortfahren möchten, sehen Sie sich dsh an, um den Befehl an eine Liste von Rechnern zu senden. Wahrscheinlich wird das mit dem sudo-Problem nicht helfen.

Das sagte ...

Sie sagen, dass "die Remote-Maschinen so konfiguriert sind, dass das Passwort für sudo nie verlangt wird", aber es sieht so aus, als ob sudo nach einem Passwort fragen möchte. Überprüfen Sie noch einmal, dass Sie sich bei diesen Maschinen anmelden können, dann führen Sie Sudo aus, und es wird OK ohne Passwort ausgeführt. Wenn das funktioniert, dann prüfe, ob es in der Umgebung etwas anderes gibt, nachdem du dich eingeloggt hast. ZB führe 'ssh you @ remotehost env' gegen Hosts, wo sudo funktioniert und nicht funktioniert.

Um ehrlich zu sein, ich bin mehr darüber verwirrt, wie Sudo funktioniert, wo Sie es sagen, als wie es scheitert. Sollten Sie das Folgende nicht verwenden?

my_account ALL=(ALL) NOPASSWD: ALL

Wenn Sie nicht so sind, wie arrangieren Sie, dass Sie kein Passwort benötigen?

Ich würde ein Skript schreiben, um das zu tun, was Sie brauchen (z. B. do_stuff.sh), und dann wie folgt ausführen:

ssh me@remote_host < do_stuff.sh

Möglicherweise benötigen Sie dort ein ssh -t, aber dies führt das Skript do_stuff.sh aus der Ferne aus, ohne es tatsächlich auf die Remote-Server zu kopieren.

Ich hatte das gleiche Problem beim Ausführen von Sudo-Befehlen über den zabbix-Agenten. Um mein Problem zu lösen, habe ich die folgende Datei im Verzeichnis sudoers.d abgelegt.

# zabbix-specific additions to sudoers file

Cmnd_Alias ZABBIXCMDS =/usr/local/sbin/zabbix_user_*,/usr/local/sbin/zabbix_discovery_*
zabbix ALL=(ALL)  NOPASSWD: ZABBIXCMDS
Defaults!ZABBIXCMDS !requiretty

Dieses Muster sollte auf Ihre Bedürfnisse eingehen. Es ist nicht spezifisch für Zabbix, passen Sie es also einfach an Ihre Verwendung an - alle Teile sind hier.