如何通过scp-script

问题描述

如果您对这个问题有一个简单的答案,请花点时间阅读以下内容,我对我的要求的解决方案很感兴趣。

目的是要自动将(最终特定的)从服务器A上传的内容重定向到另一服务器B。 在客户端上有一个上传表单(<form class="dropzone" enctype="multipart/form-data" action="upload.php" method="POST"> ...),它在serverA上调用upload.php。上传到serverA正常。在serverA上是一个脚本,该脚本应由upload.php触发(无需我作为用户登录到serverA!)将上传的文件传输到serverB。

如果您认为这可能是一条可行的道路(我没有找到终点),我在这里说明自己的工作...

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 :\n\n";
        echo (shell_exec("./scp-up.sh $uploadfile"));
} else {
        echo "Upload to server A failed\n";
}
echo "Debug info of upload.php:\n";
print_r($_FILES);
echo '</pre>';
?>

这可以正常工作,并且文件已正确存储在serverA的uploads-directoy中。
现在调用脚本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>&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

如您所见:全部更改为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

(我尝试在scp命令中使用-o KexAlgorithms=ecdsa-sha2-nistp256,但这一次失败。)

说得很清楚,我不太了解cert概念,因此可能会丢失一部分。 在这方面,我只是请求 this 路径(带有密钥和cert的scp)是否是一个好的路径。 如果您知道实现目标的更简单方法,那么我宁可对此有所了解!

有什么主意吗?

由于外行有很多可能性,所以我非常感谢依赖知识和/或经验而不是假设的答案...

非常感谢您!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...