如何在单个 SSH 会话中仅使用 ssh、cat 和 diff 上传文件,然后检查该文件并运行其他命令?

如何在单个 SSH 会话中仅使用 ssh、cat 和 diff 上传文件,然后检查该文件并运行其他命令?

目标是根据不可靠(无线)连接的许多设备上的一些参数进行更改 - 根据格式为:IP、参数、参数的 csv

我想制作一个上传文件的 bash 脚本,然后根据本地副本检查文件的内容,然后在远程端仅使用 bash、ssh、cat 和 diff 运行其他命令。远程Linux服务器(Busybox)上只有基本工具可用,而且有数千个,因此扩展很重要。我非常希望在单个 SSH 会话中完成所有这些操作,其中身份验证只需以一种方式进行一次。暂时假装安全不是问题。我正在研究如何将 rsa 公钥分发扩展到所有这些,但现在,我希望它能够与密码身份验证一起使用。请不要将此变成对安全实践的玩笑。也许有一种更简单的方法来实现上述目标。如果有,请分享。谢谢。

所以步骤是:

  1. 登录远程盒子。
  2. 将本地文件复制到远程盒子的特定目录中。
  3. 运行 diff 或某种类型的文件复制错误检查。
  4. 如果错误,则停止脚本,否则继续。
  5. 在远程盒子上运行其他命令。
  6. 将命令的结果输出到本地文件。
  7. 关闭会话。
  8. 冲洗并重复。

下面是一种伪代码。但它让你知道我正在尝试做什么。 diff 没有看到对本地文件进行编目的输出,因此它认为它们不一样。

IFS=\,
while read IP PARAM1 PARAM2; do
    
cat /home/user/uploadscript.sh | sshpass -p $password ssh -v -o StrictHostKeyChecking=no -l uname 192.168.x.x 'cat > /tmp/script.sh && cat | diff -sb - /tmp/script.sh && IP="IP" && P1="$PARAM1" && P2="$PARAM2" && ./script.sh'
    
done < list_of_ipaddresses.txt >> log.txt

答案1

也许是这样的:

{
  sha1sum /dev/fd/3 3< file-to-transfer &&
    cat file-to-transfer
} | ssh host '
  read sum &&
    cat > transferred-file &&
    echo "$sum" | sha1sum --quiet -c 3< transferred-file || exit
  cmd-that-expect-a-properly-transmitted-file'

(假设目标用户的登录 shellhost类似于 Bourne)。

请注意,这ssh保证了传输的完整性,但校验和验证仍将涵盖中止的传输以及目标上可能有缺陷的存储设备(尽管数据可能会被缓存)。如果不是后者,检查尺寸就足够了。

答案2

您需要的唯一命令是scp.与任何其他命令一样,scp返回状态代码 0 表示成功,返回非零表示错误。如果scp返回0,则文件上传成功。

if scp …; then
  echo >&2 "The file was uploaded successfully."
else
  echo >&2 "There was an error uploading the file."
fi

答案3

在这种情况下,如果我没记错的话,答案就在上面关于使用 ControlMaster 的评论中。谢谢@Jakuje!

相关内容