Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Apache _ [PHP][SFTP][shell_exec] Problem z wykonaniem skryptu .sh

Napisany przez: MateuszRyaN 3.01.2019, 19:05:34

Witam, nie wiedziałem za bardzo pod który dział podpiąć problem, pod PHP czy pod Serwery www, ale spróbuje tutaj.

Próbuję wysłać 6 plików na serwer SFTP.
Autoryzacja do tego serwera odbywa się za pośrdenictwem privateKeya i hasła.
Za cholerę ssh2_connect czy nawet biblioteka phpseclib nie może połączyć się z serwerem. Nie autoryzuje mi połączenia lub nie akceptuje mi pliku klucza i robi inne dziwne kwiatki. Natomiast w konsoli używając:

  1. sftp -oIdentityFile=privateKey.pem -oServerAliveInterval=60 -oServerAliveCountMax=10000 -oTCPKeepAlive=yes username@host
łączy się normalnie.

A że musze to puścić PHPem, bo skrypt ma się wykonać przez przeglądarke. Sięgnąłem po "expect".
Bardzo prosty skrypt doit.sh wygląda następująco:
  1. #!/usr/bin/expect
  2.  
  3. spawn sftp -oIdentityFile=privateKey.pem -oServerAliveInterval=60 -oServerAliveCountMax=10000 -oTCPKeepAlive=yes username@host
  4. expect "Enter passphrase for key 'privateKey.pem'"
  5. send "password\n"
  6. expect "sftp>"
  7. send "lcd /var/www/html/STIR/upload/03012019/\n"
  8. expect "sftp>"
  9. send "lpwd\n"
  10. expect "sftp>"
  11. send "cd /var/www/html/server/EXPORT/STIR/\n"
  12. expect "sftp>"
  13. send "put file1.TXT\n"
  14. expect "sftp>"
  15. send "put file1.TXT.SEM\n"
  16. expect "sftp>"
  17. send "put file2.TXT\n"
  18. expect "sftp>"
  19. send "put file2.TXT.SEM\n"
  20. expect "sftp>"
  21. send "put file3.TXT\n"
  22. expect "sftp>"
  23. send "put file3.TXT.SEM\n"
  24. expect "sftp>"
  25. send "bye\n"
  26. interact
Jak puszczę go w konsoli ./doit.sh wykonuje się prawidłowo...i wszystkie 6 plików wysyłane są na serwer poprawnie, następuje rozłączenie z serwerem.
Problem pojawia się, gdy próbuję ów skrypt odpalić stosując
  1. $make = http://www.php.net/shell_exec("./doit.sh");
Po wypluciu sobie echo $make; w przeglądarce, mogę zaobserwować że skrypt jest zatrzymywany w trakcie kopiowania 2 ostatnich plików...log kończy się na 54% przesyłania pliku...

Czas przesyłania tych 6 plików to około 25sekund...
Łącznie mają nieco poniżej 3mb.

Dodam, że w php.ini wszystko ustawiłem dla testów na maxa (max_execution_time = 0 , max_time_limit = -1) , ale i to nic nie pomaga. Zresztą na pewno nie jest to wina tych ustawień gdyż przeglądarka prawidłowo wyświetla efekt POST'a (nie pojawia się żadnen memory limit itp)...

I tutaj moje pytanie, czy może shell_exec ma jakiś swój czas wykonania skryptu?
Lub co może być problemem, że w konsoli skrypt jest wykonany od A do Z, log wygenerowany jest od samego połączenia aż do bye i rozłączenia z serwerem... a log shell_exec wyświetla się do połowy..i tak też kończy pracę.

P.S. Gdy skrócę ilość wysyłanych plików do 4...i jeszcze z takimi wielkościami po 50kb plik, to shell_exec wszystko ładnie pięknie kończy...czyli ewidentnie gdzieś tu chodzi o czas :/

Napisany przez: Pyton_000 3.01.2019, 19:20:53

co do PHP to widziałeś to? https://stackoverflow.com/questions/13064681/php-ssh2-auth-pubkey-file-not-working-with-encrypted-private-key

Ew. Przekonwertuj sobie ten klucz na pub i priv a potem normalnie http://php.net/manual/en/function.ssh2-auth-pubkey-file.php

Napisany przez: MateuszRyaN 3.01.2019, 19:37:56

Dzięki za szybką odpowiedź, oczywiście że konwertowałem. Dostałem nawet plik pkk i musiałem posiłkować się PuttyGenem to uzyskania z tego klucza prywatnego i publicznego, ale żadną z typowych metod nie potrafiłem się połączyć.

  1. $connection = ssh2_connect($host, $port);
  2. ssh2_auth_pubkey_file($connection, $username, $pubKey, $privKey, $passphrase);
Miałem zwrotkę taką samą jak kolega czyli ssh2_auth_pubkey_file(): Authentication failed for username using public key
A jeżeli chodzi o blibliotekę phpseclib to:
  1. if ($sftp->login('username', $key)) {
  2. http://www.php.net/echo 'tak';
  3. } else {
  4. http://www.php.net/echo 'nie';
  5. }
wypluwa nie tongue.gif

Napisany przez: Pyton_000 3.01.2019, 19:44:50

1. Sprawdzałeś czy idzie się połączyć z sftp przy uzyciu klucza publicznego? (zestaw z konwersji)
2. czy w phpseclib używałeś tego klucza pem?

Napisany przez: MateuszRyaN 3.01.2019, 19:54:52

Przy zapodaniu

  1. sftp -oIdentityFile=publicKey.pub -oServerAliveInterval=60 -oServerAliveCountMax=10000 -oTCPKeepAlive=yes username@host
Pyta o hasło, ale po wpisaniu nie wchodzi, jakby nie poprawne hasło, ale
  1. sftp -oIdentityFile=privateKey.pem -oServerAliveInterval=60 -oServerAliveCountMax=10000 -oTCPKeepAlive=yes username@host
wpuszcza normalnie....

Przy phpseclib używałem pliku privateKey.pem


Dodam, że oba pliki klucza mają chmody 400 i chowny na www-data

Napisany przez: Pyton_000 3.01.2019, 19:56:51

Nie wchodzi bo musisz podać klucz prywatny zamiast publiczny smile.gif (w sensie ten prywatny powstały z przekonwertowania pary pem.)

Napisany przez: MateuszRyaN 4.01.2019, 13:59:20

Dobrze Cię zrozumiałem,mam ten privateKey.pem jeszcze przekonwertować na private i public?
Czy chodzi Ci o to aby z privateKey.pem wyłuskać klucz publiczny coś typu

  1. openssl rsa -in privateKey.pem -pubout
  2. czy
  3. ssh-keygen -y -f privateKey.pem
  4. czy
  5. ssh-keygen -i -m privateKey.pem -f public-http://www.php.net/key.pem
  6. czy
  7. ssh-keygen -y -f privateKey.pem > public-http://www.php.net/key.pub


Konwertowania z konsoli nie próbowałem.
Posiłkowałem się programikiem Putty Key Generator. Tam importowałem tego privateKey.pem'a i on wypluwa public keya typu:
  1. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9kfwanzIXJ4BAgd3myWoeSDDGprDNSTYalJ+RON4AYCjiGeDu0sOnjqVtoWMRxQ820kvsv4iUMnXsTrewyklCNLsyUNt62htuvyvcVLSHtLqJFkBXrhg
    ncF7+SEXiakQivYD50EifpU4ZlMGN/LzwQ40zRa4uXQyaGH16ifxPtggKjfaVNKXqfsdkUJ7JlnP6VlLV3pQM/ckLHIWB9FtMWDB1fHirqwjJEZAC04ez4askDtP4jUMcfYtQOynbZuRCB33qLf2GvWpafmaC83m7i53ee
    34MuOAixk6HOwXwTzTc8wVwPndSXSjtAGRQ/ScjQ3dpSWLhZ7lFGUe/viwN imported-openssh-http://www.php.net/key

Ale widzę że jest tam jeszcze opcja z tego wszystkiego eksportu do privata ponownie...więc może to o to chodzi.

Czyli sugerujesz, że jeśli uda mi sie wygenrować klucz prywatny z tej pary .pem, to powinienem na niego wtedy móc wejść przez phpseclib
lub ssh2_auth_pubkey_file (podając mu tego wygenerowanego jak wyżej public keya + wygenerowanego privata ?

No chyba że namieszałem totalnie, to mnie popraw smile.gif

Temat do zamknięcia.
Problem rozwiązał się po zastosowaniu phpseclib w wersji 2.0.3

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)