Quiero crear el alias para este comando. ssh usuario @ ip como
alias [0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9] ="ssh user@$0"
Lo he creado, pero no está funcionando. ¿Hay algún error de sintaxis en este comando?
No, no puedes usar de esa manera.
Con un alias puedes ordenar un comando cuando lo escribes. Por ejemplo:
alias ls="ls -lh"
Cuando escribes ls
, el sistema sabe que estas diciendo que quieres hacer ls -lh
.
En tu caso, si quieres mantener. ssh user@
para solo escribir el nombre del servidor, un mejor enfoque es declarar algo como esto:
alias myssh="ssh -l user"
Entonces cuando lo hagas myssh server
lo que realmente estás haciendo es ssh -l user server
.
No, no puedes usar expresiones regulares en el comando alias.
Para lograr lo que quieres, en Bash, puedes usar el command_not_found_handle
. Desde el Manual de referencia :
Si el nombre no es una función de shell ni una incorporada, y no contiene barras, Bash busca en cada elemento de
$PATH
para un directorio que contiene un archivo ejecutable con ese nombre. Bash usa una tabla hash para recordar las rutas completas de los archivos ejecutables para evitar múltiplesPATH
búsquedas (ver la descripción de hash en Bourne Shell Builtins). Una búsqueda completa de los directorios en$PATH
se realiza solo si el comando no se encuentra en la tabla hash. Si la búsqueda no tiene éxito, el shell busca una función de shell definida llamadacommand_not_found_handle
. Si esa función existe, se invoca con el comando original y los argumentos del comando original como sus argumentos, y el estado de salida de la función se convierte en el estado de salida del shell. Si esa función no está definida, el shell imprime un mensaje de error y devuelve un estado de salida de 127.
Entonces puedes hacer algo como esto:
command_not_found_handle() {
local i ip ip_ok=0
if [[ $1 = +([[:digit:]]).+([[:digit:]]).+([[:digit:]]).+([[:digit:]]) ]]; then
IFS=. read -a ip <<< "$1"
ip_ok=1
for i in "${ip[@]}"; do
[[ $i = $((10#$i)) ]] && (( i>=0 && i<=255 )) || { ip_ok=0; break; }
done
fi
if ((ip_ok)); then
ssh "user@$1"
else
( unset -f command_not_found_handle; "$@" )
fi
}
Ahora si estas en un ambiente donde command_not_found_handle
ya está definido, por ejemplo, en Ubuntu, ya sabes, el mensaje genial como
The program 'whatever' can be found in the following packages:
* whatever
* whatever-ever
Try: sudo apt-get install <selected package>
Es muy probable que no quieras anular esto. Puede parchear la función de la siguiente manera (en su .bashrc
):
# Guard to not monkey-patch twice, in case this file is sourced several times
if ! declare -f kalai_command_not_found_existent &>/dev/null; then
mapfile -s1 -t kalai_command_not_found_existent_ary < <(declare -f command_not_found_handle 2>/dev/null)
if ((${#kalai_command_not_found_existent_ary[@]})); then
eval "$(printf '%s\n' "kalai_command_not_found_existent ()" "${kalai_command_not_found_existent_ary[@]}")"
else
kalai_command_not_found_existent() { ( unset -f command_not_found_handle; "$@" ) }
fi
command_not_found_handle() {
local i ip ip_ok=0
if [[ $1 = +([[:digit:]]).+([[:digit:]]).+([[:digit:]]).+([[:digit:]]) ]]; then
IFS=. read -a ip <<< "$1"
ip_ok=1
for i in "${ip[@]}"; do
[[ $i = $((10#$i)) ]] && (( i>=0 && i<=255 )) || { ip_ok=0; break; }
done
fi
if ((ip_ok)); then
ssh "user@$1"
else
kalai_command_not_found_existent "$@"
fi
}
unset command_not_found_existent_ary
fi