Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][SFTP][shell_exec] Problem z wykonaniem skryptu .sh, W konsoli skrypt wykonuje się poprawnie w shell_exec nie
MateuszRyaN
post 3.01.2019, 19:05:34
Post #1





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 10.11.2010
Skąd: Jastrzębie Zdrój

Ostrzeżenie: (0%)
-----


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 = 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 :/

Ten post edytował MateuszRyaN 3.01.2019, 19:12:20
Go to the top of the page
+Quote Post
Pyton_000
post 3.01.2019, 19:20:53
Post #2





Grupa: Zarejestrowani
Postów: 7 754
Pomógł: 1364
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


co do PHP to widziałeś to? https://stackoverflow.com/questions/1306468...ted-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
Go to the top of the page
+Quote Post
MateuszRyaN
post 3.01.2019, 19:37:56
Post #3





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 10.11.2010
Skąd: Jastrzębie Zdrój

Ostrzeżenie: (0%)
-----


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. echo 'tak';
  3. } else {
  4. echo 'nie';
  5. }
wypluwa nie tongue.gif
Go to the top of the page
+Quote Post
Pyton_000
post 3.01.2019, 19:44:50
Post #4





Grupa: Zarejestrowani
Postów: 7 754
Pomógł: 1364
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
MateuszRyaN
post 3.01.2019, 19:54:52
Post #5





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 10.11.2010
Skąd: Jastrzębie Zdrój

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Pyton_000
post 3.01.2019, 19:56:51
Post #6





Grupa: Zarejestrowani
Postów: 7 754
Pomógł: 1364
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Nie wchodzi bo musisz podać klucz prywatny zamiast publiczny smile.gif (w sensie ten prywatny powstały z przekonwertowania pary pem.)
Go to the top of the page
+Quote Post
MateuszRyaN
post 4.01.2019, 13:59:20
Post #7





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 10.11.2010
Skąd: Jastrzębie Zdrój

Ostrzeżenie: (0%)
-----


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-key.pem
  6. czy
  7. ssh-keygen -y -f privateKey.pem > public-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-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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.05.2019 - 07:12