【问题标题】:How to execute a command over ssh and store the value in a variable如何通过 ssh 执行命令并将值存储在变量中
【发布时间】:2014-08-06 05:08:20
【问题描述】:

我正在尝试通过 ssh 从远程计算机获取 uname -r 的值,并在我的本地脚本流中使用该值。

kern_ver=uname -r
sshpass -p "$passwd" ssh -o StrictHostKeyChecking=no root@$c 'kern_ver=echo \$kern_ver'

但看起来该值没有传回本地脚本流。

【问题讨论】:

标签: linux shell ssh


【解决方案1】:

将命令存储在变量cmd 中是可选的;您可以将命令硬编码为ssh 的字符串参数。关键是你只需通过ssh在远程主机上运行命令,并在本地主机上捕获它的输出。

cmd="uname -r"
kern_ver=$(sshpass -p "$passwd" ssh -o StrictHostKeyChecking=no root@"$c" "$cmd")

【讨论】:

  • “硬编码”是很重要的一点:如果命令不是完全硬编码但包含参数化部分,则需要更复杂的技术来防止外壳注入攻击。
【解决方案2】:

捕获是var=$(...),一如既往。

ssh 有点有趣,因为它无条件地调用远程 shell,因此使用完全任意的命令(与 uname -r 这样的简单命令相反)需要不同的技术:

filename="/path/to/name with spaces/and/ * wildcard characters *"
printf -v cmd_str '%q ' ls -l "$filename"
output=$(ssh "$host" "$cmd_str")

通过这种方式,您可以使用带空格的参数,并且它们将通过正确的引用传递到远程系统(需要注意的是,不可打印的字符可能会使用 bash-only 语法进行引用,因此只能保证在远程 shell 也是 bash 的情况下工作)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多