ssh-key via stdin: perl vs shell

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

ssh-key via stdin: perl vs shell

Beitrag von gxyz » 18.07.2014 19:05:56

Salut,
... ich würde gerne aus einem Script heraus ssh aufrufen und den Schlüssel in selbiges einbetten. Dabei bin ich auf folgende Kuriosität gestoßen:

Code: Alles auswählen

#!/bin/bash
ssh -i /dev/stdin luser@localhost ls  <<EOF
-----BEGIN RSA PRIVATE KEY-----
....
funktioniert anstandslos, während sich ssh bei

Code: Alles auswählen

#!/usr/bin/perl
open STDIN, ">&DATA";
exec "ssh -i /dev/stdin luser\@localhost ls";
__END__
-----BEGIN RSA PRIVATE KEY-----
....
beklagt: "Permissions 0755 for '/dev/stdin' are too open" und den Schlüssel ignoriert.
Die Permissions für das pty, auf das /dev/stdin letztlich zeigt sind natürlich jeweils gleich
(und _nicht_ 755, sondern 620).
Hat jemand eine gute Erklärung für das unterschiedliche Verhalten?

Peter

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: ssh-key via stdin: perl vs shell

Beitrag von gbotti » 04.08.2014 13:23:48

Hi.

Lass dir doch ein TMP-File schreiben. Leider kann ich auch keine Sinnvolle Erklärung für /dev/stdin oder /dev/stdout geben, da ich mir darüber ehrlicherweise noch keine Gedanken in diese Richtung gemacht habe.

Siehe Beispielsweise: http://perldoc.perl.org/File/Temp.html
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: ssh-key via stdin: perl vs shell

Beitrag von Cae » 04.08.2014 15:17:40

Ich hab' den Thread schon vor ein paar Tagen gelesen und mir war nix aufgefallen, aber jetzt wird mir ein Unterschied bewusst: Die Shell-Variante macht fork(2) und dann im Child das execve(2), waehrend es bei der Perl-Variante keinen Elternprozess mehr gibt. Das /dev/stdin verweist also im ersten Fall auf eine Pipe zum Elternprozess anstatt auf einen file descriptor des Prozesses selbst.

Mein Testfall belegt dabei allerdings keine unpassenden Rechte...

Code: Alles auswählen

$ true | strace -e 'trace=execve,open,fstat' -f -o exec sh -c 'exec /usr/bin/tail /dev/stdin'
$ true | strace -e 'trace=execve,open,fstat' -f -o no-exec sh -c '/usr/bin/tail /dev/stdin'
$ sed -i 's/^[0-9]\+ //' *exec
$ diff -U0 *exec
--- exec	2014-08-04 14:43:25.639240184 +0200
+++ no-exec	2014-08-04 14:43:25.639240184 +0200
@@ -1 +1 @@
-execve("/bin/sh", ["sh", "-c", "exec /usr/bin/tail /dev/stdin"], [/* 33 vars */]) = 0
+execve("/bin/sh", ["sh", "-c", "/usr/bin/tail /dev/stdin"], [/* 33 vars */]) = 0
@@ -14,0 +15 @@
+--- SIGCHLD (Child exited) @ 0 (0) ---
$ less exec 
$ less exec 
$ tail -2 exec
open("/dev/stdin", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
$ 
0600 beim letzten fstat(2) sollte passen.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten