Esto es lo que estoy tratando de hacer:

ssh andy@<ip_address> "cat .bash_aliases; sayhello"

Esto es lo que pasa:

alias sayhello="echo hello"
bash: sayhello: command not found

Para ser más específico sobre mi problema, estoy tratando de invocar el comando
"sudo etherwake -i eth0 <mac_address>" sobre ssh: esto se ejecuta (creo) en mi computadora local, dando un error sudo: unable to resolve host [blabla]. Parece que mi máquina local analiza cualquier comando que no sea un comando bash estándar.

Si eso es lo que está sucediendo, ¿cómo puedo evitarlo? Si no, ¿cuál es la explicación?

4
AndyP 15 jun. 2017 a las 05:27

3 respuestas

La mejor respuesta

En general, esta no es una buena idea para usar alias en los scripts.

Sin embargo, puedo sugerir una forma de hacerlo, pero tenga en cuenta lo inseguro que es.

  • Se basa en eval,
  • Lee archivos remotos en el contexto de shell.

Aquí vamos.

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

Explicación:

  1. Por defecto, la expansión de alias está habilitada solo para shells interactivos. Para encenderlo, use el comando shopt -s.

  2. Deberá obtener los alias en su contexto de shell de todos modos.

  3. Ahora está configurado para usar sus alias a través del comando eval.

7
Dmitri Chubarov 15 jun. 2017 a las 03:43

Bueno, es un truco bastante desordenado, pero funciona:

$ 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

Esto también funciona:

ssh xxx.xxx.158.40 "source aliases; \$( alias sayhello | cut -d\' -f2 )"
0
Jack 15 jun. 2017 a las 03:46

@ajreal dio una solución simple en los comentarios anteriores: simplemente ponga lo que desea que suceda en un archivo y luego ejecute el archivo.

Así que creé un archivo en el host llamado sayhello.sh (que contiene solo la línea echo Hello), luego en mi máquina local usé

ssh andy@<ip_address> "sh sayhello.sh"

0
AndyP 15 jun. 2017 a las 08:36