我在这里被这段代码困住了
user@server:~$ TEST="ssh [email protected] 'date; hostname -A; uname -a'"
user@server:~$ $TEST
bash: date; hostname -A; uname -a: Command not found.
我想在 shell 脚本中使用它,但不知道是什么问题。两个系统都是debian wheezy,
但是如果直接执行命令:
user@server:~$ ssh [email protected] 'date; hostname -A; uname -a'
Fre Aug 23 20:02:55 CEST 2013
otherserver.example.org
Linux otherserver 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux
那么这里有什么大不了的????我中继错过了一些非常琐碎的事情,但无法弄清楚......请帮助......
这背后的想法是,我在脚本中构建了一个长字符串并在单个 SSH 会话中远程执行它(将 zfs 快照重命名为 n.0 变成 n.1 等等)
但它不工作是希望它工作......
编辑/更新:更新了对我的问题的更深入理解的例子(从“日期;日期;日期”到“日期;主机名 -A;uname -a”)
感谢您迄今为止的所有回复。起初 eval 有效,但如用户所述,似乎已被弃用。所以我的工作就是再次弄清楚如何改变它。
必须如此构建的字符串女巫看起来像这样:
echo "Rearanging snapshots..."
last_backup=7
first_backup=0
RENAME_STRING="'sudo zfs destroy $BACKUP_DATASTORE@n.$last_backup; "
while [ $last_backup -gt $first_backup ]
do
RENAME_STRING=$RENAME_STRING"sudo zfs rename $BACKUP_DATASTORE@n.$(($last_backup - 1)) $BACKUP_DATASTORE@n.$last_backup"
if [ $(($last_backup - 1 )) -gt $first_backup ]
then
RENAME_STRING=$RENAME_STRING"; "
else
RENAME_STRING=$RENAME_STRING"'"
fi
last_backup=$(($last_backup - 1 ))
done
#CURRENTLY SOLVED WITH EVAL as this one doesn't work...
#remote_cmd=(/usr/bin/ssh "$BACKUP_USER@$HOST_TO" "$RENAME_STRING")
#"${remote_cmd[@]}"
eval /usr/bin/ssh $BACKUP_USER@$HOST_TO $RENAME_STRING
所以也许你们会有更优雅的方法来解决这个问题?
编辑2:
这个输出“OK”吗?(好吧,就像不弃用的方式一样,并且可以很好地使用?
user@server:~$ TEST="date ; hostname -A ; uname -a"
user@server:~$ ssh [email protected] <<< "$(printf '%s ' $TEST)"
Pseudo-terminal will not be allocated because stdin is not a terminal.
Linux otherserver 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Fre Aug 23 20:13:53 CEST 2013
otherserver.example.org
Linux otherserver 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux
EDI3:更新/改进 (?) while loop eval 仍用作 <<< 在脚本中不起作用...
通过 ssh 远程执行本地命令的建议方法是不使用 eval。这是不鼓励的。由于您将整行存储在变量中,因此您可以
Eval 应该只用于不提供安全工具的遗留系统,如我向您展示的示例。
这会产生与您使用交互式 shell 运行这些命令完全相同的结果。
希望它至少能给你一些想法。
更新以演示命令如何也可以远程运行,而无需定义本地变量。
尝试 shell/bash 内置eval命令:
没有理由编写如此长的命令字符串以通过 SSH 运行。只需在调用的远程主机上创建一个永久脚本
/usr/local/sbin/rotate_backups
并使用ssh $USER@$HOST 'sudo /usr/local/sbin/rotate_backups'
.如果您在“Unix & Linux” StackExchange 上问这个问题,那么这可能是一个有趣的问题。但是,作为系统管理员,您的目标应该是可维护性和安全性。如果你无法理解你的剧本,你的同事和继任者会诅咒你。
尝试这个:
它创建一个数组并按照BashFAQ/050第 3 项中的建议执行它。
发现问题
我从单曲开始我的长串,
'
从单曲开始'
现在我自己保留所有单引号(
'
)创建字符串并在末尾添加双引号,所有工作!那么有人可以向我解释一下,为什么我不能在我的变量中设置引号?
这个结构现在工作得很好。谢谢大家的帮助!我希望我的回答也能帮助别人!(后面会整理 ALL_CAPITAL 的东西;))