Как SCP локальный файл из BASH OSX для удаленного через SSH с паролем в PHP?

Я хочу, чтобы 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 в корневой каталог сервера, и эта ошибка исчезла.

Может кто-нибудь помочь, пожалуйста, как заставить это работать?
Спасибо

1

Решение

Я нашел решение и заставил его работать, но не уверен, что это правильный путь.
Проблема не связана с паролем. Проблема была / была: Сценарий 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-соединение.

Если кто-то может внести свой вклад в улучшение этого ответа, я буду очень признателен.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector