2010-04-14 22 views
17

Próbuję wywołać ssh-keygen przy użyciu zmiennej przez bash jako dane wejściowe zamiast pliku, aby uzyskać odcisk palca klucza publicznego. Jestem świadomy, że mogę użyć pliku tymczasowego, aby obejść ten problem, ale z powodów poza zakresem tego pytania, nie chcę.ssh-keygen akceptuje stdin

Metoda ta ma nie pracę jak mówi plik klucza jest nieprawidłowy (jest to poprawne na pewno)

echo $pubkey | ssh-keygen -lf /dev/stdin 

Ten robi prace, ale nie używa zmiennej, raczej plik.

ssh-keygen -lf alpha.pub 

Ten robi prace, ale nie używa zmiennej, raczej przekierowany pliku.

ssh-keygen -lf /dev/stdin < alpha.pub 

to robi nie pracę bo mam niejednoznaczne przekierować

ssh-keygen -lf /dev/stdin < $(echo $pubkey) 

chciałbym docenić pewne wyobrażenie, jak dostać ssh-keygen do zapoznania się ze zmiennej z kluczem publicznym, a jeśli możliwe, wyjaśnienie, dlaczego przekierowania nie robią tego, co myślę, że powinni robić. W szczególności dlaczego | zachowuje się inaczej niż < i dlaczego trzeci przykład to ambiguous redirect. Szukałem w Internecie, ale wiele z samouczków przekierowujących nie odpowiadało na moje pytania.

Odpowiedz

13
echo $pubkey | ssh-keygen -lf /dev/stdin 
/dev/stdin is not a public key file. 

/dev/stdin jest faktycznie rura UNIX, a nie zwykłym plikiem, więc ssh-keygen nie otwiera plik

ssh-keygen -lf /dev/stdin <<<$key 
1024 92:6a:3f:5c:1f:78:..... 

/dev/stdin odnosi się do zwykłego pliku, utworzone za pomocą heredoc bash . Można to sprawdzić:

# ls -l /dev/stdin <<<$pubkey 
lrwxrwxrwx 1 root root 15 Feb 11 08:07 /dev/stdin -> /proc/self/fd/0 
# ls -l /proc/self/fd/0 <<<$pubkey 
lr-x------ 1 juergen juergen 64 Apr 14 13:31 /proc/self/fd/0 -> /tmp/sh-thd-1271250023 (deleted) 
+1

Na Ubuntu 14.04, Bash 4.3.11, jądro 3.13.0-24-generic, to nie działa i zgłasza '/ dev/stdin: Stale file handle'. –

+4

Nie działa na komputerach Mac. – Will

-1

Polecam używanie pliku tymczasowego. Problem polega na tym, że przekierowanie, BASH oczekuje pliku. Używając $ (echo $ pubkey), bash zacznie narzekać, ponieważ gdy zostanie wykonane z substytucją, będzie szukał pliku o tej nazwie utworzonego przez podstawienie.

3

Jeśli chcesz przekierować ciąg jako stdin, należy użyć następującej składni:

cmd <<< "some $STR here" 

Jeśli chcesz przekierować dane wyjściowe polecenia, jak gdyby był to plik, możesz zrobić to tak:

cmd <(/bin/somecmd) 

a jeśli chcesz użyć polecenia jako plik wyjściowy, to jest mniej więcej taka sama:

cmd >(/bin/othercmd) 
+1

Tak więc 'ssh-keygen -lf/dev/stdin <<<" $ pubkey "' prawdopodobnie zrobi to, co chce OP. – caf

+0

@caf: Ten formularz działa dla mnie. –

2

Od wersji 7.2 (wydany na 2016-02-28), to jest teraz możliwe dzięki przejściu - jak nazwa pliku. From the release notes:

  • ssh generacji klucza (1) pozwala odcisków od standardowego wejścia, npssh-keygen -lf -
+0

Po wydaniu OpenSSH 7.2, powinna to być zaakceptowana odpowiedź. Więc 'echo $ pubkey | ssh-keygen -lf -', lub tym podobne, jest teraz najlepszą drogą. – quat

0

Oto jeden liner pomocą pliku /dev/stdin jak opisano w innych odpowiedzi.

$ ssh-keygen -lf /dev/stdin <<< $(ssh-keygen -f ~/.ssh/keyname.pem -y) 
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA) 

Należy zauważyć, że zerwie to z kluczami prywatnymi, które używają hasła. Będzie działać z plikami pem generowanymi przez AWS lub OpenStack, które nie używają haseł.