我写了一些如下所示的脚本
main.sh
ls
./os.sh
os.sh
cat /etc/os-release
执行就像
ssh user@serverA "bash -s" < ./main.sh "hi" "bye"
但这仅适用于 中的命令main.sh
,它无法执行 中的命令它尝试在远程计算机中os.sh
查找。os.sh
但是这种类型的脚本如何运行呢?
答案1
您可以将带有脚本的整个目录和所有必需的依赖项传输到临时目录中。
user
假设on的登录 shellhost
类似于 POSIX,并且有mktemp
,tar
和gunzip
命令,则可能是:
tar cf - . | gzip -1 | ssh user@host '
set -o errexit
tmpdir=$(mktemp -d)
trap '\''rm -rf -- "$tmpdir"'\'' EXIT TERM HUP ALRM
cd -P -- "$tmpdir"
gunzip | tar xf -
./main.sh'
答案2
os.sh
Linux 没有像在两台计算机之间共享脚本文件的内置方法。
因此,要实现在远程计算机上调用脚本的目标os.sh
,您必须将脚本放在计算机上。有一些方法可以暂时做到这一点,也有方法可以“永久”做到这一点。选项的简要调查:
- 如果您有一个在本地计算机和您感兴趣的远程计算机之间共享的文件系统,请复制
os.sh
到该文件系统并从那里调用它。 - 创建一个包含 的包
os.sh
,将其添加到本地包存储库,并使用包管理命令将该包安装在您可能想要调用它的所有计算机上。 - 使用 Puppet、Chef、Saltstack 等配置管理系统将文件安装
os.sh
到您感兴趣的计算机上。脚本可以以包形式安装(如上一个选项),也可以单独安装。 - 使用将脚本复制
os.sh
到远程计算机scp
,并在运行完成后将其删除。 - 使用 Ansible 自动将
os.sh
脚本复制到远程计算机、调用它,然后删除它。
前三个选项是“永久”选项,这意味着该脚本始终在远程服务器上可用,而不仅仅是在 ssh 会话期间可用。最后两个是“临时的”,将脚本放在服务器上的时间只够调用它。
永久技术需要进行大量额外工作来创建技术所依赖的基础设施资源。但是,如果您在一家拥有大量服务器的公司工作,则这些资源中的一个或另一个可能已经就位。
临时技术更加自力更生,不需要额外的工作来创建基础设施。名为的软件套件Ansible
可以自动化将脚本文件复制到远程主机、调用它以及随后删除它的部分。 Ansible 默认通过 ssh 进行操作,如果需要,它甚至可以自动在远程计算机上使用 sudo 获取 root 权限。
如果您只想在一台服务器上执行此操作并且可能每月一次,那么执行您自己的 scp/delete 可能就是您想要的。如果您经常执行此类操作或在许多远程计算机上执行此操作,那么我建议您在本地计算机上安装 Ansible,并学习它在远程服务器上复制/调用/删除脚本所需的相当简单的命令。