我正在尝试通过 ssh 运行一个别名,该别名通过 ssh 运行另一个别名。这可能吗?
我在看这关于通过 ssh 运行别名的问题,到目前为止我得到了这个:
ssh develop -t /bin/bash -ic "gotoserver"
gotoserver
是运行的别名:
ssh -o StrictHostKeyChecking=no -l user 10.10.10.10
这一切都有效,我最终达到了10.10.10.10
。但我想在里面运行另一个别名,10.10.10.10
所以我尝试了这个:
ssh develop -t /bin/bash -ic "gotoserver -t /bin/bash -ic 'loaddocker'"
但这不起作用。似乎只能认到gotoserver
。我仍然结束了,10.10.10.10
但命令的其余部分 ( -t /bin/bash -ic 'loaddocker'
) 似乎被忽略了。
但如果我进去develop
跑:
gotoserver -t /bin/bash -ic 'loaddocker'
它起作用并被loaddocker
执行。
我究竟做错了什么?我可以用另一种方式来做这件事而不改变develop
and中的任何内容10.10.10.10
吗?
答案1
使用函数而不是别名!
function fnchunk () {
echo -n function\ ;
typeset -f ${@}
}
function requote ()
{
if (($#)); then
local re savedq='#...___+++...#' dblquote='"' singlequote="'" escapedsinglequote="\'" escapeddblquote='\"';
re="$(printf "${savedq}%s${savedq} " "${@}")";
re="${re//${dblquote}/${escapeddblquote}}";
echo "${re//${savedq}/${dblquote}}";
fi
}
function loadDockerWrapper(){
echo loaddocker # call loadDocker script not alias
# or if it was an alias turn it into function here
}
function gotoserver(){
/usr/bin/ssh -o StrictHostKeyChecking=no -l user 10.10.10.10 -tq "$(fnchunk fnchunk requote gotoserver loadDockerWrapper)" ";" $(requote "${@}")
}
function devCmd(){
/usr/bin/ssh -tq develop "$(fnchunk fnchunk requote gotoserver loadDockerWrapper)" ";" $(requote "${@}")
}
devCmd gotoserver loadDockerWrapper
答案2
gotoserver
应该包含类似于$@
所有gotoserver
参数的内容。您可以这样使用它:
ssh -o StrictHostKeyChecking=no -l user 10.10.10.10 $@
其中$@
将传递给 gotoserver 的所有参数,并且ssh
它将是在 10.10.10.10 上发出的命令。
此外,您可以通过用 分隔来逐个发出几个命令;
,例如:
echo a ; echo b