Isto é factível - mesmo com alias
, embora a única maneira que conheço envolva eval
, o que pode ser perigoso dependendo do que os argumentos possam conter - mas não com regex. O problema real aqui é a tokenização - para cada comando simples que o shell lê, ele tenta executar qualquer palavra encontrada em posição do comando como um alias primeiro, então. falhando isso, como uma função / builtin, e, falhando ambos, como um executável $PATH
ed. Esta é uma simplificação do processo, mas é bem próxima da verdade.
O problema é que você tem em uma única palavra dois tokens possíveis - ssh
é o que você gostaria de executar, e @$IP
é um < em> argumento com o qual você gostaria de executá-lo. Você pode fazer como foi sugerido em outro lugar e simplesmente dividir o token em dois combinados com uma função shell - isso é feito simplesmente. Ou você pode obter o primeiro token para dividir-se .
Uma coisa interessante sobre os nomes do shell $var
é que eles são bem explícitos sobre quais caracteres eles podem conter. Salve um único caso especial, @
não está entre esses. Se eu fizer:
$var_this_is_appended_to_the_name
O shell interpretará a string inteira como um nome de variável único, porque todos os caracteres dentro são permitidos dentro de um $var
name. Mas ...
$var@this_is_appended_to_the_name
... resulta em dois tokens (se não necessariamente duas palavras ) e o shell expande $var
independentemente de @the_rest . A expansão do alias, infelizmente, não tem nenhum marcador conveniente como $
e, portanto, o shell sempre tentará expandir ...
alias@this_is_appended; alias_this_is_appended
... como um único token. É também porque o shell expande ambos $var
e aliased cmdstring
simultaneamente que o último não pode ser contido no primeiro e ainda ser executado sem eval
- mas então qualquer argumento dado $var
- even ${varcontains='$(cmd substitutions)'}
será avaliado duas vezes - o que pode ser bastante perigoso.
Então eu proponho que você faça algo com uma variável readonly
chamada $ssh
que se parece com isso:
ssh() { case "$1" in
(@*) set -- "$USER$@";;
esac; command -p ssh "$@"
}
readonly ssh='ssh '
Dessa forma, você pode fazer ...
[email protected]; [email protected]
... ou ...
ssh @someplace.com
... e etc. ou qualquer outra coisa, porque o shell irá dividir os dois tokens que são $ssh
e @somplace.com
em duas palavras . Não funciona, no entanto, se você ...
"[email protected]"
... porque nesse caso, apesar de você receber dois tokens, o resultado ainda é uma única palavra. Eu usei readonly
acima para garantir que $ssh
varname não possa ser sabotado e redefinido para algo mais perigoso, mas isso ainda pode ser possível com a função ssh
para qualquer usuário normal no shell. Não tenho conhecimento de nenhum meio que possa ser usado para readonly
uma função de shell, mas, se isso for uma preocupação para você, talvez você queira localizar a função em um script de shell $PATH
ed com leitura / gravação apropriada direitos.
Então, novamente, ele pode funcionar sem uma função se configurado a partir de um arquivo de perfil ou qualquer outra coisa:
[mikeserv@localhost ~]$ readonly "ssh=ssh $USER"
[mikeserv@localhost ~]$ $ssh@localhost
mikeserv@localhost's password:
Mas é menos flexível assim.