Próbuję kontrolować systemy ssh-agent, dodając do nich nowe klucze, używając ssh-add. Do tego używam komponentu Symfony Process.Sterowanie procesem interaktywnym za pomocą PHP za pomocą procesu Symfony
Kiedy uruchomić ten kod ze strony internetowej działa idealnie w porządku, ale po uruchomieniu tego samego kodu w powłoce/console proces ssh-add wisi na Enter passphrase for <path to key>:
Uproszczona wersja kodu wygląda mniej więcej tak to
use Symfony\Component\Process\Process;
$keyPath = '<path to key>';
$keyPassword = '<password for unlocking the key>';
$socketPath = '<path to ssh-agent socket>';
$sshAdd = new Process(
"ssh-add {$keyPath}",
null,
[
'SSH_AUTH_SOCK' => $socketPath
],
$keyPassword
);
$sshAdd->run();
Jak widać w powyższym kodzie nawiązywać połączenia do ssh-add
, ustawia SSH_AUTH_SOCK
w środowisku tak ssh-add
może mówić do środka, a następnie wysyła hasło na wejściu. Jak już wcześniej wspomniałem, kiedy uruchamiam to w kontekście sieciowym, działa, ale zawiesza się w kontekście powłoki/konsoli.
Zrobiłem strace
, kiedy działa w konsoli i odpowiednie części wygląda następująco
open("<path to key>", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
write(4, "<key password>", <length of password>) = 20
close(4) = 0
wait4(9650, 0x7fff00ab3554, WNOHANG|WSTOPPED, NULL) = 0
select(8, [5 7], [], [], {0, 0}) = 0 (Timeout)
wait4(9650, 0x7fff00ab3554, WNOHANG|WSTOPPED, NULL) = 0
select(8, [5 7], [], [], {0, 0}) = 0 (Timeout)
select(8, [5 7], [], [], {0, 200000}Enter passphrase for <path to key>:) = 0 (Timeout)
select(8, [5 7], [], [], {0, 200000}) = 0 (Timeout)
select(8, [5 7], [], [], {0, 200000}) = 0 (Timeout)
select(8, [5 7], [], [], {0, 200000}) = 0 (Timeout)
select(8, [5 7], [], [], {0, 200000}) = 0 (Timeout)
...
Jak można zobaczyć zapis wydaje się być ignorowane i program ssh-add
zaczyna blokować czekając na wejście.
Czy jesteś gniazdowania polecenia? to pytanie oczekuje wkładu od użytkownika, ale jest zablokowane za procesem owijania. Będziesz musiał znaleźć sposób na wykonywanie podstawowych poleceń w sposób nieinteraktywny. – Flosculus
Nie sądzę, aby proces ssh_add został zablokowany, ponieważ mogę ręcznie wprowadzić hasło. Chodzi raczej o to, że skrypt PHP nie może wprowadzić hasła dla użytkownika, ponieważ ssh_add został przeniesiony na pierwszy plan, a skrypt PHP po prostu czeka, aż proces się zakończy. – codeaken
Co to są 5 i 7 FDA dla tego procesu? Gdzie otwiera się fd 4? Czy uruchomienie skryptu z powłoki ' dev/null' (i prawdopodobnie' 2 dev/null') pomaga w jej działaniu? –