Como scp-e-ssh especificando o host duas vezes?

1

Eu freqüentemente faço esse tipo de coisa:

scp somefile me@host:/some/path
ssh me@host

Digitar me@host duas vezes pode ser cansativo. Nós (ou pelo menos bash ) podemos pegar esse último argumento com !:$ , mas isso ( me@host:/some/path ) não é exatamente o que ssh quer.

Então, como eu posso scp um arquivo e, em seguida, ssh imediatamente para o mesmo host - sem ter que especificar explicitamente o host mais de uma vez?

Por favor, note que não estou interessado em salvar o host em uma variável, por exemplo, PLACE=me@host; scp somefile at $PLACE:/some/path; ssh $PLACE .

    
por user2245700 26.08.2015 / 18:09

3 respostas

1

ssh para o host usado no comando scp anterior

Bem, desde que o seu comentário armazenando me@host na variável esteja fora 1 ; nós vamos ter que fazer isso de uma maneira mais inteligente:

$ scp somefile me@host:/some/path
$ ssh "${_%%:*}" 

Isso vai te ssh para me@host .

Explicação

$_ chama o último argumento para o comando anterior. A construção %% exclui a correspondência mais longa da anterior da string. :* corresponde a tudo de dois pontos ( : ) em diante.

Portanto, "${_%%:*}" exclui tudo de : no comando anterior (ou seja, :/some/path ), deixando me@host .

Testado usando GNU bash, version 4.3.30(1)-release

1 Se você me perguntar, usar hn=me@host e usar hn nos comandos scp e ssh será mais fácil do que usar "${_%%:*}" . Particularmente se me@host for usado com bastante frequência, pode ser vantajoso definir isso em .bashrc (e / ou host in ~/.ssh/config ) para fácil uso; mas isso depende da preferência individual.

    
por 26.08.2015 / 18:22
1

Escreva um script para si mesmo - por exemplo:

#!/bin/bash

src_file=$1
dst=$2

test -n "$src_file" || exit 1
test -n "$dst" || exit 1

dst_login=${dst%%:*}

if scp $src_file $dst; then
    echo
    echo "scp succeeded, starting ssh session ..."
    ssh $dst_login
else
    echo "scp failed. Not stargin ssh session."
    exit 1
fi

Salve o arquivo acima em um arquivo, torne-o executável ( chmod a+x scp-and-ssh ), runit ( ./scp-and-ssh somefile me@somehost:somefile ).

Btw .: você pode definir o nome de usuário remoto na sua seção ~/.ssh/config in a Host . Desta forma, você só precisa especificar o nome do host remoto e deixar o me@ ausente.

    
por 26.08.2015 / 20:11
1

Typing out me@host twice can be irksome.

Isso é o que é ssh_config para. Você pode armazenar o nome de usuário e o alias do seu host:

Host short
  Hostname host
  User me

que economizará sua digitação e você terá apenas scp file short:path; ssh short . Provavelmente não é a resposta que você está procurando, mas

  • há conclusão automática
  • muito menos invasão, em seguida, alias ou variável
  • parece-me mais fácil do que digitar alguns caracteres estranhos;)
por 26.08.2015 / 20:52