ssh远程变量赋值?

问题描述 投票:0回答:2

以下对我不起作用:

ssh [email protected] "k=5; echo $k;"

它只返回一个空行。

如何在远程会话 (ssh) 上分配变量?

注意:我的问题不是如何将本地变量传递到我的 ssh 会话,而是如何创建和分配远程变量。 (应该是一个非常简单的任务?)


编辑:

更详细地说,我正在尝试这样做:

bkp=/some/path/to/backups ssh [email protected] "bkps=( $(find $bkp/* -type d | sort) ); echo 'number of backups: '${#bkps[@]}; while [ ${#bkps[@]} -gt 5 ]; do echo ${bkps[${#bkps[@]}-1]}; #rm -rf $bkps[${#bkps[@]}-1]; unset bkps[${#bkps[@]}-1]; done;"

find 命令工作正常,但由于某种原因

$bkps

 没有被填充。
所以我的猜测是这将是一个变量赋值问题,因为我认为我已经检查了其他所有内容......

unix variables ssh
2个回答
24
投票
鉴于此调用:

ssh [email protected] "k=5; echo $k;"

本地 shell 在执行

$k

 之前正在扩展 
ssh ...
(很可能未设置)。因此,一旦建立连接,实际传递到远程 shell 的命令是 
k=5; echo ;
(如果 
k=5; echo something_else_entirely;
 实际上在本地设置,则为 
k
)。

为了避免这种情况,请像这样转义美元符号:

ssh [email protected] "k=5; echo \$k;"

或者,使用单引号而不是双引号来防止局部扩展。然而,虽然这适用于这个简单的示例,但您实际上可能希望在发送到远程端的命令中对某些变量进行本地扩展,因此反斜杠转义可能是更好的路线。

为了将来参考,您还可以在 shell 中输入

set -x

 来回显正在执行的实际命令,以帮助排除故障。


0
投票
除了用

\

转义之外,还可以使用单引号。

  • ""
    :表示使用本地环境变量
  • ''
    :表示使用远程环境变量
就你而言,

ssh [email protected] "k=5; echo $k;"
应改为:

ssh [email protected] 'k=5; echo $k;'
    
© www.soinside.com 2019 - 2024. All rights reserved.