bash - 用于远程执行 SSH 命令的 Bash 脚本函数包装器
问题描述
我正在尝试创建一个允许我远程执行命令的 SSH Bash 包装函数。目标是拥有传递给函数的函数名和参数,而不用担心如何转义引用。第二个目标(虽然不那么重要)是捕获执行命令的结果。
我尝试了各种方法,但似乎没有一个在函数中起作用。
这里有两种不同的方法,我觉得我最接近预期的结果:
#!/bin/bash
s="srvr01"
ss="srvr02"
# Run commands on primary
function ssh1() {
printf -v var "%s" "$*"
ssh root@$s <<END
x() {
$*
}
x "$var"
END
}
# Run commands using secondary method
function ssh2() {
printf -v var_str "%s" "$*"
ssh -T -p 22 root@$ss $var_str
}
sshb() {
ssh1 $*
ssh2 $*
}
ssh1 echo 'net.ipv4.ip_nonlocal_bind=1' >> /etc/sysctl.conf
ssh2 echo 'net.ipv4.ip_nonlocal_bind=1' >> /etc/sysctl.conf
通过将函数传递给 ssh 然后调用它,我希望命令以安全转义的方式执行,而不是获取:
第 27 行:/etc/sysctl.conf: Permission denied
第 28 行:/etc/sysctl.conf : 没有权限
解决方案
您需要引用输出重定向运算符,否则它们将由您的本地 shell 处理,而不是作为参数传递给函数。
ssh1 echo 'net.ipv4.ip_nonlocal_bind=1' '>>' /etc/sysctl.conf
ssh2 echo 'net.ipv4.ip_nonlocal_bind=1' '>>' /etc/sysctl.conf
您还需要eval
在x()
函数中使用,因为扩展变量后不会处理重定向运算符。并且您需要转义$
应该在远程系统上扩展的 in 变量。
function ssh1() {
printf -v var "%s" "$*"
ssh root@$s <<END
x() {
eval "\$1"
}
x "$var"
END
}
我不确定那是什么意思printf
,你可以做得到var="$*"
相同的结果。你甚至不需要var
变量,只需使用x "$*"
实际上,我想我会写成:
function ssh1() {
ssh root@$s <<END
$*
END
}
推荐阅读
- struct - 一个键在多个相同类型的结构上的映射是否可能?
- sql-server - ColdFusion 11 和 Microsoft SQL Server 2017 之间是否存在任何已知问题?
- python - QSortFilterProxyModel 过滤器问题
- ruby-on-rails - 如何将 rails devise sign_in 路径设置为根 url
- c# - 如何在源代码管理中包含文件并稍后编辑
- reactjs - 刷新应用程序时,React Native Modals 保持打开状态
- c++ - opencv光流算法多线程实现没有加速
- android - 有没有办法修复无法从生成的 apk 中的 index.android.bundle 加载脚本?
- mysql - 如何根据 2 个表简化这个 mysql 查询?
- xcode - Xcode 一次又一次地尝试自我更新