这是我想要做的事情:
ssh andy@<ip_address> "cat .bash_aliases; sayhello"
以下是发生的事情:
alias sayhello="echo hello"
bash: sayhello: command not found
为了更具体地解决我的问题,我试图调用命令
"sudo etherwake -i eth0 <mac_address>"
通过ssh - 这在我的本地计算机上执行(我认为),发出sudo: unable to resolve host [blabla]
错误。似乎任何非标准bash命令的命令都由我的本地机器解析。
如果发生了什么,我该如何解决这个问题?如果没有, 的解释是什么?
答案 0 :(得分:6)
一般来说,在脚本中使用别名不是一个好主意。
然而,我可以建议一种方法来做到这一点,但要记住它是多么不安全。
eval
,我们走了。
ssh remote_host "shopt -s expand_aliases ; source ~/.bash_aliases ; eval sayhello"
默认情况下,仅为交互式shell启用别名扩展。要打开它,请使用shopt -s
命令。
无论如何,您需要将别名源化为shell上下文。
现在您已设置通过eval
命令使用别名。
答案 1 :(得分:0)
嗯,这是一个相当混乱的黑客攻击,但它确实有效:
$ ssh xxx.xxx.158.40 'source aliases; alias'
alias emacs='emacs -nw'
alias l.='ls -d .*'
alias ll='ls -l'
alias sayhello='echo hello'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
$ ssh xxx.xxx.158.40 'source aliases; $( alias sayhello | sed -e "s/.$//" -e "s/.*=.//" )'
hello
这也有效:
ssh xxx.xxx.158.40 "source aliases; \$( alias sayhello | cut -d\' -f2 )"
答案 2 :(得分:0)
@ajreal在上面的评论中提供了一个简单的解决方案 - 只需将您想要发生的事情放在一个文件中,然后执行该文件。
所以我在主机上创建了一个名为sayhello.sh
的文件(只包含行echo Hello
),然后在我的本地机器上使用
ssh andy@<ip_address> "sh sayhello.sh"