Я хочу, чтобы PHP отправил myfile.txt на удаленный SSH, который использует пароль для входа в систему.
Из OSX Bash я использую эту команду для отправки файла вручную:
scp /Users/myname/Documents/myfile.txt root@192.168.1.116:/Docs/myfile.txt
Так как мне нужно сделать это через PHP, я сделал это upload.sh
скрипт bash:
#!/usr/bin/expect
spawn scp /Users/myname/Documents/myfile.txt root@192.168.1.116:/Docs/myfile.txt
expect "root@192.168.1.116's password:"send "mYpassWORD\r"interact
Я могу запустить этот код выше с: ./update.sh
в терминале и он отправляет файл как я хочу.
Теперь проблема в том, что когда я добавляю этот скрипт bash в PHP, он не отправляет файл.
Я пытался:
exec('/Library/WebServer/update.sh 2>&1', $output);
print_r($output);
И я застрял в этой ошибке / MSG:
Array
(
[0] => spawn scp /Users/myname/Documents/myfile.txt root@192.168.1.116:/Docs/myfile.txt
[1] => root@192.168.1.116's password:
)
В bash пароль отправляется и все в порядке, через PHP он не загружает файл.
Я также заметил, что в первый раз, когда я запускаю его через PHP, он говорит, что SSH Host Keys не совпадает, поэтому я скопировал папку .ssh в корневой каталог сервера, и эта ошибка исчезла.
Может кто-нибудь помочь, пожалуйста, как заставить это работать?
Спасибо
Я нашел решение и заставил его работать, но не уверен, что это правильный путь.
Проблема не связана с паролем. Проблема была / была: Сценарий Bash слишком быстрый. Или, может быть, PHP слишком быстрый?
В любом случае я решил свою проблему, добавив sleep
после send "mYpassWORD\r"
,
Вот моя рабочая команда Bash, к которой я обращаюсь из PHP для отправки файла на удаленный компьютер с паролем:
#!/usr/bin/expect
spawn scp /Library/WebServer/Documents/test34/myfile.txt root@192.168.1.116:/Docs/myfile.txt
expect "root@192.168.1.116's password:"send "mYpassWORD\r"sleep 0.2
interact
Я сохранил это как: update.sh
и сделал chmod +x update.sh
Тогда в PHP-файле: index.php
я написал:
<?php
$do = shell_exec("(/Library/WebServer/Documents/test34/update.sh)");
var_dump($do);
?>
И получил это УСПЕХ:
string(320) "spawn scp /Library/WebServer/Documents/test34/myfile.txt root@192.168.1.116:/Docs/myfile.txt
root@192.168.1.116's password:
myfile.txt 0% 0 0.0KB/s --:-- ETA
myfile.txt 100% 3649 3.6KB/s 00:00
"
Так что просто добавив sleep 0.2
в Bash-скрипте проблема решена.
Я тоже пробовал sleep 0.1
но потом я получил ошибку. Поэтому время сна может зависеть от того, насколько велик ваш файл? myfile.txt был всего 3,6 КБ и 0,2 секунды сна прекрасно работает.
Если ваш файл больше, вы можете попробовать sleep 1
или же sleep 5
так далее..
Этот метод работает и решает проблему, но не чувствует себя в безопасности, поскольку он может потерпеть неудачу, если размер файла меняется при каждом вызове или если у вас медленное ssh-соединение.
Если кто-то может внести свой вклад в улучшение этого ответа, я буду очень признателен.
Других решений пока нет …