¿Podemos usar expresiones regulares en el comando alias?


1

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?

Respuestas:


0

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.


0

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últiples PATH 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 llamada command_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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.