Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [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
 
Start new topic
Odpowiedzi
MateuszRyaN
post 4.01.2019, 13:59:20
Post #2





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

Posty w temacie


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: 20.04.2024 - 00:27