【问题标题】:setting a local bash variable from an ssh command从 ssh 命令设置本地 bash 变量
【发布时间】:2014-09-20 03:06:05
【问题描述】:

我正在运行一系列 sshpass > ssh > 命令,我想将在远程服务器中运行的其中一个命令的退出代码存储在一个变量中,以便在 ssh 完成后我可以在本地访问它。到目前为止我所做的似乎没有存储任何东西。请帮忙!

我的代码:

    sshpass -p password ssh user@ip "echo \"first command\" ; su -lc \"./root_script.sh\" ; set MYVAR = $? ; rm root_script.sh \" 
if (( $MYVAR != 0 )) ; then
     echo "Cannot continue program without root password"
     exit
fi

问题: 命令全部执行(脚本运行正常),但未设置变量 MYVAR。我已经将它初始化为一个奇怪的数字,并且值没有改变。 su 退出码未存储!

注意事项:

1) 我不想做 MYVAR=$(ssh....) 因为 ssh 嵌套在 sshpass 中,我不想要其中任何一个的退出代码,我想要返回代码su 命令在远程服务器中运行

2) 我使用了 set 命令,因为简单的赋值给了我一个错误,说命令无法识别。

3) 我尝试了不同形式的引用( \$? 或 '$?' 或 "$?" ),但似乎都不起作用

4) 我尝试将 MYVAR 导出到环境变量,并尝试在代码行之前取消设置。仍然没有存储任何值。

【问题讨论】:

  • myvar=$(ssh ...) 不存储退出代码,而是存储输出。除非 sshpass 修改了输出,否则这里不应该相关。
  • ...除此之外 -- export 使 子进程 可以访问变量。没有父进程的积极参与(例如读取和存储或评估其子进程的输出流),您无法使父进程可以访问变量。
  • 因此,您可以echo $? 返回 su 命令的退出状态。

标签: bash ssh set


【解决方案1】:

首先,您需要将要捕获的内容放在进程的stdout上。

其次,远程命令需要使用单引号,而不是双引号——否则,$? 将在字符串传递给 ssh 之前被其本地值替换!

exit_status=$(sshpass -p password ssh user@ip 'echo "first command" >&2; \
              su -lc "./root_script.sh" >&2; echo "$?"; rm root_script.sh')
echo "Exit status of remote command is $exit_status"

【讨论】:

  • 已经有一个echo作为命令,给用户状态信息。因此,第一个回声也将存储到 exit_status 中,不是吗?
  • @natharra,确实;我假设你打算用真正的命令替换它,但如果你真的想给用户写消息,使用>&2 将它们定向到stderr。
  • 啊,当然。我必须对重定向进行一些尝试,因为我确实希望用户看到一些消息(“密码:”和脚本中的一些消息),但我理解这个概念。谢谢!
  • 密码提示通常直接发送到 TTY,而不是通过 stdout/stderr,但是……嗯,这是一个更大的话题。
  • 这确实是一个更大的话题@CharlesDuffy。我仍然无法正确重定向事物。但是,这是一个全新的问题,介意研究一下吗?:stackoverflow.com/questions/25018675/…
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 2021-09-01
  • 2021-07-23
  • 2019-02-07
相关资源
最近更新 更多