• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

PHP: sftp per identityfile und batch -> kein Zugriff

fenring

New member
Guten Morgen.

Aus einem Verzeichnis sollen Dateien per sftp auf einen entfernten Server übertragen werden. Die Verbindung wird per sFTP im Batch-Mode hergestellt:

Code:
sftp -oIdentityFile=/root/.ssh/id_dsa -b /var/www/batch/test user@host 2>&1

Der public key liegt genau da, und über die Konsole auf dem Server gestartet wird auch die Batchdatei ausgeführt, die Dateien werden übertragen. Jetzt soll das ganze mitten aus einem PHP-Script ausgeführt werden:

Code:
$exec = exec('sftp -oIdentityFile=/root/.ssh/id_dsa -b /var/www/batch/test user@host 2>&1', $out, $return);
echo '<pre style="text-align:left">';var_dump($out, $return, $exec);echo '</pre>';

Das bringt folgendes Ergebnis:
Code:
array(3) {
  [0]=>
  string(43) "Could not create directory '/var/www/.ssh'."
  [1]=>
  string(29) "Host key verification failed."
  [2]=>
  string(46) "Couldn't read packet: Connection reset by peer"
}
int(255)
string(46) "Couldn't read packet: Connection reset by peer"

Was will er denn da? Na gut die drei Dateien aus '/root/.ssh/' nach '/var/www/.ssh' kopiert, Ergbnis:
Code:
array(2) {
  [0]=>
  string(29) "Host key verification failed."
  [1]=>
  string(46) "Couldn't read packet: Connection reset by peer"
}
int(255)
string(46) "Couldn't read packet: Connection reset by peer"

Die Schlüsseldateien sind mit 0600, das Verzeichnis mit 0700 bedacht. PHP läuft (auch laut phpinfo()) als root. Trotzdem geht das ganze nicht per exec().

Für Vorschläge wäre ich wirklich dankbar.

Viele Grüße
Fenring

[EDIT /]
Hm, der Hund lügt. Natürlich läuft PHP als User apache. Batch/Schlüssel Verzecihnise und Dateien per chown an den apache übergeben. Jetzt bekomme ich eine neue Fehlermeldung:

Code:
array(2) {
  [0]=>
  string(30) "Permission denied (publickey)."
  [1]=>
  string(46) "Couldn't read packet: Connection reset by peer"
}
int(255)
string(46) "Couldn't read packet: Connection reset by peer"
 
Zuletzt bearbeitet:
Lösung gefunden:

Nur weil ein Nutzer triviale Befehle wie
Code:
ls -l
ausführen darf, heißt das nicht dass er Shellzugriff hat. Da kommt zwar eine Rückgabe, allerdings kommt die daher, dass der Server derartiges auf ganz andere Systemfunktionen umleitet. Der standard Apache-User hat keine Shellrechte. Wenn man einen entsprechenden Nutzer anlegt geht auch alles.
 
Zurück
Oben