如何通过ssh

时间:2017-06-15 02:27:14

标签: bash ssh

这是我想要做的事情:

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命令的命令都由我的本地机器解析。

如果发生了什么,我该如何解决这个问题?如果没有, 的解释是什么?

3 个答案:

答案 0 :(得分:6)

一般来说,在脚本中使用别名不是一个好主意

然而,我可以建议一种方法来做到这一点,但要记住它是多么不安全。

  • 它依赖于eval
  • 它将远程文件读入shell上下文。

我们走了。

ssh remote_host "shopt -s expand_aliases ; source ~/.bash_aliases ; eval sayhello"

说明:

  1. 默认情况下,仅为交互式shell启用别名扩展。要打开它,请使用shopt -s命令。

  2. 无论如何,您需要将别名源化为shell上下文。

  3. 现在您已设置通过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"