Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
远程执行的复杂bash命令中的变量值_Bash_Ssh - Fatal编程技术网

远程执行的复杂bash命令中的变量值

远程执行的复杂bash命令中的变量值,bash,ssh,Bash,Ssh,我想在远程主机上运行复杂的命令列表。我可以通过使用这样的命令创建另一个脚本,然后让我的另一个脚本调用它(无论是否将它复制到远程主机),来轻松解决这个问题,但我不想这样做。我的问题是,对于整个脚本,我有一些固定的变量,然后是for循环变量。我可以在远程主机上对这两种方法中的一种进行正确的评估,但不能同时对这两种方法进行评估。在类似的问题上,我所发现的只是关于使用注释引号的讨论,“或”围绕不同的元素。我没有尝试过同时处理固定变量(在ssh之前展开)和循环变量(远程展开)(给你强调一下,@Inian,

我想在远程主机上运行复杂的命令列表。我可以通过使用这样的命令创建另一个脚本,然后让我的另一个脚本调用它(无论是否将它复制到远程主机),来轻松解决这个问题,但我不想这样做。我的问题是,对于整个脚本,我有一些固定的变量,然后是for循环变量。我可以在远程主机上对这两种方法中的一种进行正确的评估,但不能同时对这两种方法进行评估。在类似的问题上,我所发现的只是关于使用注释引号的讨论,“或”围绕不同的元素。我没有尝试过同时处理固定变量(在ssh之前展开)和循环变量(远程展开)(给你强调一下,@Inian,因为你他妈的不能在把问题标记为重复的东西之前阅读完整的问题,而不是重复的东西)

固定值=“蓝色”
ssh远程主机已重组:

fixed_value="blue"
value_list=( VALUE1 VALUE2 )
for i in "${value_list[@]}"; do
    echo "executing $i"
    ssh remote_host "my_program -arg1 $i -arg2 $fixed_value"
done
如果您真的希望在一次调用中完成这一切,那么将其作为脚本编写,
scp
it over,然后
ssh
在目标机器上调用它

…或将其本地写入临时文件:

$: cat a
echo '
fixed_value="blue"
value_list=( VALUE1 VALUE2 )
for i in "${value_list[@]}"; do
    echo "executing $i"
    echo "my_program -arg1 $i -arg2 $fixed_value"
done
'>/tmp/foo && . /tmp/foo && rm /tmp/foo
然后将其作为

ssh remote_host < a
重组:

fixed_value="blue"
value_list=( VALUE1 VALUE2 )
for i in "${value_list[@]}"; do
    echo "executing $i"
    ssh remote_host "my_program -arg1 $i -arg2 $fixed_value"
done
如果您真的希望在一次调用中完成这一切,那么将其作为脚本编写,
scp
it over,然后
ssh
在目标机器上调用它

…或将其本地写入临时文件:

$: cat a
echo '
fixed_value="blue"
value_list=( VALUE1 VALUE2 )
for i in "${value_list[@]}"; do
    echo "executing $i"
    echo "my_program -arg1 $i -arg2 $fixed_value"
done
'>/tmp/foo && . /tmp/foo && rm /tmp/foo
然后将其作为

ssh remote_host < a
!/bin/bash
固定值=“蓝色”
qq=“”
ssh远程\u主机bash-c“
值\u list='VALUE1 VALUE2'
对于\$value\u列表中的i;执行
echo${qq}正在执行\$i$qq
我的_程序-arg1\$i-arg2'$fixed_值'
完成
"
我已经将该命令包装在一个
bash-c“…”
命令中。因为您仍然需要一些双引号,而且我不信任转义引号,所以我创建了一个
$qq
变量来表示双引号字符。变量从服务器端传递(
$qq
$fixed\u value
)将取消scape,以便将其值传递给服务器。服务器端求值(
$value\u list
$i
)的变量将转义,以便通过远程bash调用对其进行解释

此客户端脚本的退出代码将是
ssh
的退出代码,它应该由
myu程序的最后一次迭代的退出代码指定(除非
ssh
本身失败或终止)。

!/bin/bash
固定值=“蓝色”
qq=“”
ssh远程\u主机bash-c“
值\u list='VALUE1 VALUE2'
对于\$value\u列表中的i;执行
echo${qq}正在执行\$i$qq
我的_程序-arg1\$i-arg2'$fixed_值'
完成
"
我已经将该命令包装在一个
bash-c“…”
命令中。因为您仍然需要一些双引号,而且我不信任转义引号,所以我创建了一个
$qq
变量来表示双引号字符。变量从服务器端传递(
$qq
$fixed\u value
)将取消scape,以便将其值传递给服务器。服务器端求值(
$value\u list
$i
)的变量将转义,以便通过远程bash调用对其进行解释


此客户端脚本的退出代码将是
ssh
的退出代码,该代码应由
myu程序的最后一次迭代的退出代码指定(除非
ssh
本身失败或终止).

谢谢你的回复。老实说,我没有指定它,但我试图避免使用单字符串语法,因为它看起来更适合短命令。不过,我还是选择了这种方法。唯一的一点是,出于某种原因,bash-c总是抱怨缺少参数,所以我选择了“ssh-t remote\u host”命令“'如果您这样做,例如,
ssh-t远程\u主机“ls 123”
,则它将尝试执行
“ls 123”
太过字面化,bash将给您
ls 123:command not found
。使用
sh-c
bash-c
可以让您指定具有适当间距的命令。@AdamKatz,我没有看到这个问题。远程命令接收
ssh-t remote_host“ls 123”的带引号的字符串
,但不是引号…不过我有点喜欢你的嵌入式引号解决方案。谢谢你的回答。老实说,我没有指定它,但我试图避免使用单字符串语法,因为它看起来更适合短命令。不过,我还是选择了这种方法。唯一的一点是,出于某种原因,bash-c总是抱怨缺少argument,所以我决定使用“ssh-t remote\u host”命令,如果您这样做,例如
ssh-t remote\u host“ls 123”
,那么它将尝试执行
“ls 123”
太过字面化,bash将给您
ls 123:command not found
。使用
sh-c
bash-c
可以让您指定具有适当间距的命令。@AdamKatz,我没有看到这个问题。远程命令接收
ssh-t remote_host“ls 123”的带引号的字符串
,但不是引号……不过,我有点喜欢您的嵌入式引号解决方案。谢谢,但是,正如我在文章的第一行中提到的,我不想创建第二个文件。我并不反对可维护性方面。我正在为我的同事合并脚本,因为它们是缺乏某些工具的临时解决办法(目前正在开发中)。由于目标用户是CS知识非常有限的人,因此单个文件对他们来说更容易(而且因为它很快就会被丢弃,所以维护不是问题).关于您的解决方案,我已经考虑过这种方法,但在我看来,只连接一次并完成所有需要的操作,而不是反复打开和关闭连接,更为简洁。在这个特定脚本中,这并不重要,但如果循环超过数千项,系统管理员可能会生我的气?我不知道当然,所以我想以一种更安全的方式来播放。哈哈…是的,我也想到了临时文件。我想看看