【问题标题】:shell command runs in shell but not in scriptshell 命令在 shell 中运行,但不在脚本中
【发布时间】:2023-10-15 13:37:01
【问题描述】:

我正在编写一个包含以下行的 shell 脚本 -

sshpass -p "pwd" ssh -t hostname@$ip1 ' cd /path/to/home/oflops/cbench; ./cbench -c $ip2 -p 6633 -m 1000 -l 10 -M 1000 -s 1 -t; ' >> file

上述行在 shell 中工作正常,但在脚本中不起作用。请帮忙,我是脚本编写新手,无法找出我的错误。

【问题讨论】:

  • 我没有收到任何错误。问题是 ssh 后必须在 shell 中运行的命令不起作用。
  • 你怎么知道它不起作用?
  • 这些命令“cd /path/to/home/oflops/cbench; ./cbench -c $ip2 -p 6633 -m 1000 -l 10 -M 1000 -s 1 -t;”没有运行。
  • 这些命令没有运行,因为我无法在输出文件中看到这些命令生成的输出。
  • “命令未运行”并不总是等同于“无法看到输出”......只是说。但更重要的是,$ip2 在单引号内,因此不会被扩展。

标签: bash shell ssh sshpass


【解决方案1】:

像这样运行你的命令:

sshpass -p "pwd" ssh -t hostname@$ip1 "cd /path/to/home/oflops/cbench; ./cbench -c $ip2 -p 6633 -m 1000 -l 10 -M 1000 -s 1 -t;" >> file

即为您的命令使用双引号而不是单引号,以便能够扩展变量,例如 $ip2

【讨论】:

    【解决方案2】:

    “sshpass”命令没有在 bash 脚本中运行。我将上面的脚本更改如下,使其运行-

    `sshpass -p "pwd" ssh -o StrictHostKeyChecking=no hostname@$ip1 "cd /path/to/home/oflops/cbench; ./cbench -c $ip2 -p 6633 -m 1000 -l 10 -M 1000 -s 1 -t;" >> file`
    

    【讨论】:

    • 在命令周围添加反引号不会以任何其他方式不会运行的方式“使其运行”。相反,它所做的是获取命令的输出、字符串拆分和全局扩展该输出,并将结果作为第二个命令本身运行。此外,由于您将输出重定向到文件,因此可以保证没有输出可供反引号解释,这意味着它们不会产生任何可能的影响。
    • ...也就是说,如果抑制与 stdin 的连接可能起到了作用,我不会感到惊讶,但如果这实际上解决了你的问题,你会想直接做( </dev/null) 而不是这种黑客攻击。
    最近更新 更多