我需要在远程服务器上运行本地脚本。运行脚本以并行运行很重要。
[ec2-user@ip-172-31-43-140 ~]$ cat hosts.txt
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[ec2-user@ip-172-31-43-140 ~]$ cat hosts.txt | xargs -I {} ssh {} -T 'bash -s' < ./file.sh
ssh: Could not resolve hostname #!/bin/sh: Name or service not known
xargs: ssh: exited with status 255; aborting
[ec2-user@ip-172-31-43-140 ~]$
答案1
这样做时我喜欢这种形式:
$ cat hosts.txt | xargs -n1 -P8 sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh
或者{}
如果您需要它们:
$ cat hosts.txt | xargs -n1 -P8 -I{} sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh {}
例子
你好.bash$ cat hello.bash
#!/bin/bash
echo "hi from server: $(hostname)"
ssh xargs
$ cat hosts.txt | xargs -n1 -P8 sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh
hi from server: mulder.mydom.com
hi from server: skinner.mydom.com
hi from server: manny.mydom.com
细节:
-n1 -P8
- 告诉xargs
以 1 个参数作为输入并运行 8 个实例ssh
sh -c 'ssh -T "$1"
- 这会调用 shell,然后运行命令
-c "..."
- 请注意,我们
$1
在这里传递,这是为了避免注入攻击。 -T
禁用伪终端。是正在编辑的$1
文件的内容。cat
- 这会调用 shell,然后运行命令
bash -s < ./hello.bash'
- 将传递给的命令ssh
sh
- 尾部是作为要调用的 shell 传递sh
的内容,参数 #0 ( )。xargs
$0
参考
答案2
hello.bash
:
doit() {
echo Define
echo what you want done in a
echo function
}
export -f doit
然后做:
. hello.bash
parallel --env doit --slf hosts.txt --tag --nonall doit
答案3
是的,您可以使用 AWS Systems Manager 来执行此操作。 AWS Systems Manager Run Command 允许您在 EC2 以及本地服务器上远程安全地运行命令集。以下是实现这一目标的高级步骤。
附加实例 IAM 角色:ec2 实例必须具有策略为 AmazonSSMFullAccess 的 IAM 角色。此角色使实例能够与 Systems Manager API 进行通信。
安装 SSM 代理:EC2 实例上必须安装 SSM 代理。 SSM 代理处理运行命令请求并根据命令配置实例。
执行命令:通过 AWS CLI 的用法示例:--instance-ids
给出 ec2 实例 ID 列表。执行以下命令以检索实例上运行的服务。将 Instance-ID 替换为 ec2 实例 ID。
aws ssm send-command --document-name "AWS-RunShellScript" --comment "listing services" --instance-ids "Instance-ID" --parameters commands="service --status-all" --region us-west-2 --output text
更多信息这里