团队,我正在从 ubuntu 客户端在远程 ubuntu 服务器上执行一些命令。我想将其输出保存到本地客户端目录。
保存通过 ssh 会话运行的命令的结果后,尝试从客户端运行其他命令。
步骤:通过代理命令连接到远程 ssh,然后启动一个进程,然后将其状态保存在文件中。我希望此文件保存在本地而不是远程。其次,当我在远程机器上手动执行命令时,我看到状态已保存在文件中,但通过脚本执行时文件仍为空。有什么提示吗?
ssh -o StrictHostKeyChecking=no -i test-ssh-key -o 'ProxyCommand ssh -i test-ssh-key -W %h:%p [email protected]' lab@$free_node "echo Test!!123 | sudo -S echo; sudo systemctl start cachefilesd; sudo rm /var/log/cachefiles_status.log; sudo ps x | grep cachefilesd | sudo awk '{print $1}' | sudo sed -n -e 1,1p | xargs -l1 -- sh -c 'sudo grep "State:" /proc/$1/status' -- | awk -F '(' '{print $2}' | awk -F ')' '{print $1}' > /tmp/cachefiles_status.log; sudo cp /tmp/cachefiles_status.log /var/log/; sudo cat /var/log/cachefiles_status.log; ls -ltr /var/log"
答案1
使用ssh_配置(~/.ssh/config
)设置您的代理设置。它将大大缩短您的一行代码。
就像您将命令传递给服务器一样,您可以将它们的输出存储到临时文件中,然后通过 SSH 代理将 rsync 输出文件存储到本地计算机中。如果存在 ssh_config,Rsync 将使用它,但您也可以通过 rsync 的 -e 标志指定自定义 SSH 设置。
因此你的 ssh 配置将会是这样的:
主机 free_node StrictHostKeyChecking 否 IdentityFile 测试-ssh-key 用户实验室 代理命令 ssh -i test-ssh-key -W %h:%p[电子邮件保护]
然后:
rsync -av free_node:/root/output.log ~/
或者,如果你的服务器上没有 rsync 并且你无法安装它,你可以使用SCP反而。
scp free_node:/root/output.log ~/
但是我建议使用ansible或任何其他自动化工具来完成这项工作。Ansible 使用 ssh 和 ad-hoc 命令。Python 是服务器端的唯一要求,但是ansible 的原始模块你甚至不需要在服务器上安装 python。你还可以使用自定义 ssh 命令通过代理传递连接,如中所述ansible 常见问题。