#bash #file-transfer #scp #unattended-processing
#bash #передача файлов #scp #автоматическая обработка
Вопрос:
Если у вас есть простой ответ на этот вопрос, избавьте себя от необходимости читать следующее, я заинтересован в решении моего требования.
Целью является безопасное перенаправление (наконец, конкретных) загрузок с сервера на другой ServerB автоматически. На клиенте есть форма загрузки ( <form class="dropzone" enctype="multipart/form-data" action="upload.php" method="POST">
…), которая вызывается upload.php
на сервере. Загрузка на сервер работает нормально. На сервере есть скрипт, который должен передавать загруженный файл на ServerB, запускаемый upload.php (без моего входа в систему как пользователя на сервере!).
Здесь я излагаю, что я сделал, если вы считаете, что это может быть практичным путем (где я не нашел конца)…
upload.php:
<?php
$uploaddir = './uploads/';
$uploadfile = $uploaddir . basename($_FILES['file']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded to A.n";
echo "Now: call of scp-up.sh $uploadfile :nn";
echo (shell_exec("./scp-up.sh $uploadfile"));
} else {
echo "Upload to server A failedn";
}
echo "Debug info of upload.php:n";
print_r($_FILES);
echo '</pre>';
?>
Это работает нормально, и файлы должным образом хранятся в директории загрузки сервера.
Теперь вызывается скрипт scp-up.sh
для передачи на ServerB:
scp-up.sh:
#!/bin/bash
echo "scp $1"
scp -v -B -i ./.ssh/id_rsa -o IdentitiesOnly=yes -o KexAlgorithms=ecdh-sha2-nistp256 $1 ssh-userb@serverb.kasserver.com:/www/htdocs/web/uploads/ 2>amp;1
Когда я вхожу в систему и использую этот скрипт с именем файла, он работает.
Но не тогда, когда это оставлено в покое.
Сначала я попробовал без параметров -o, что привело к «Сбою проверки ключа хоста» в раннем состоянии, и id_rsa-cert.pub
отсутствовал. Итак, я сгенерировал новую пару ключей ssh-keygen -f ca_key
и создал этот сертификат с помощью ssh-keygen -s ca_key -I server-b -h -n serverb.kasserver.com ./id_rsa.pub
.
Теперь у меня есть эти файлы
-rwx------ 1 ssh-usera usera 1679 Aug 16 18:23 ca_key
-rwx------ 1 ssh-usera usera 402 Aug 16 18:23 ca_key.pub
-rwx------ 1 ssh-usera usera 1679 Aug 16 17:45 id_rsa
-rwx------ 1 ssh-usera usera 1375 Aug 16 18:35 id_rsa-cert.pub
-rwx------ 1 ssh-usera usera 402 Aug 16 18:03 id_rsa.pub
-rwx------ 1 ssh-usera usera 444 Aug 16 17:45 known_hosts
как вы можете видеть: все chmodded как 700.
Результат: сертификат больше не отсутствует, «Ошибка проверки ключа хоста» теперь находится в состоянии задержки.
Вот результат:
File is valid, and was successfully uploaded to A.
Now: call of scp-up.sh ./uploads/ACT_0180.jpg :
scp ./uploads/ACT_0180.jpg
Executing: program /usr/bin/ssh host serverb.kasserver.com, user ssh-userb, command scp -v -t /www/htdocs/userb/web/uploads/
OpenSSH_7.2p2 Ubuntu-4ubuntu2.10, OpenSSL 1.0.2g 1 Mar 2016
debug1: Connecting to serverb.kasserver.com [85.13.888.999] port 22.
debug1: Connection established.
debug1: identity file ./.ssh/id_rsa type 1
debug1: identity file ./.ssh/id_rsa-cert type 5
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.10
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.2p2 Ubuntu-4ubuntu2.10
debug1: match: OpenSSH_7.2p2 Ubuntu-4ubuntu2.10 pat OpenSSH* compat 0x04000000
debug1: Authenticating to serverb.kasserver.com:22 as 'ssh-userb'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: ecdh-sha2-nistp256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: compression: none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:DXdT/AyN2 QYF2P7/ZFP9P4JsHlGrCCTBOx1zmDaSy8
Host key verification failed.
lost connection
Debug info of upload.php:
Array
(
[file] => Array
(
[name] => ACT_0180.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpanRmnx
[error] => 0
[size] => 621562
)
)
Для сравнения: вот результат успешно выполненного скрипта, когда я вошел в систему:
https://pastebin.com/raw/p5JAT9FC
(Я попытался использовать -o KexAlgorithms=ecdsa-sha2-nistp256
в scp-команде, но это сразу не удается.)
Ясно сказано, я не совсем понял концепцию сертификата, поэтому некоторые ее части могут отсутствовать. В этом отношении я прошу о помощи, только если этот путь (scp с ключами и сертификатом) является правильным. Если вы знаете более простой подход к достижению цели, мне скорее интересно узнать об этом!
Есть идеи?
Поскольку существует МНОЖЕСТВО возможностей для непрофессионалов, я был бы очень признателен ответчикам, которые полагаются на знания и / или опыт, а не на предположения…
Заранее большое вам спасибо!
Комментарии:
1. Похоже, вам нужен полный / абсолютный путь к файлу ключа вместо этого
./.ssh/id_rsa
2. Похоже, что в вашем успешном примере вы запустили команду от имени root. Как насчет неудачного случая? От имени какого пользователя выполняется команда?
3. @Ivan: Я впервые попробовал использовать абсолютные пути, но скрипт — при вызове веб-запроса — похоже, не имел доступа к этому файлу. sth. ответом вроде бы было «такого файла нет».
4. @Kenster: это на обычном веб-хостинге all-inkl, у меня там нет root-доступа. И кто пользователь скрипта? Я не знаю..