Como passar a senha para scp?

297

Sei que não é recomendado, mas é possível passar a senha do usuário para scp?

Gostaria de copiar um arquivo via scp como parte de um trabalho em lotes e o servidor de recebimento precisa, é claro, de uma senha e, não, não posso alterá-lo facilmente para autenticação baseada em chave.

Argelbargel
fonte
2
Consulte também a pergunta (mais tarde): stackoverflow.com/questions/1462284/…, em que uma resposta menciona outra maneira possível de fazer isso. (NB: esta não é uma questão duplicado - é o original que os outros duplicados.)
Jonathan Leffler

Respostas:

35

Você pode criar um script com uma ferramenta como expect (também existem ligações úteis, como o Pexpect for Python).

Pat Notz
fonte
1
O link para expect.nist.gov está quebrado. Talvez isto ?: expect.sourceforge.net
Katapofatico
sudo apt-get install esperar
SDsolar 23/01
>> informações sobre fermentação sshpass Erro: Nenhuma fórmula disponível com o nome "sshpass" Não adicionaremos sshpass porque facilita demais para usuários iniciantes do SSH arruinarem a segurança do SSH. ;)
Lukas NP Egger 16/10
528

Use sshpass :

sshpass -p "password" scp -r [email protected]:/some/remote/path /some/local/path

ou então a senha não aparece no histórico do bash

sshpass -f "/path/to/passwordfile" scp -r [email protected]:/some/remote/path /some/local/path

O acima copia o conteúdo do caminho do host remoto para o seu local.

Instalar:

  • ubuntu / debian
    • apt install sshpass
  • centos / fedora
    • yum install sshpass
  • mac com macports
    • port install sshpass
  • mac w / brew
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
KevinS
fonte
14
No Ubuntu 12.04, ele só funcionou para mim com aspas simples sobre a senha (por exemplo, 'senha' em vez de "senha").
Odedfos
6
@odedfos, sim, você precisa usar aspas simples porque alguns senha gerada caracteres pode ter uma interpretação especial em dobro interpolação string
TerryE
7
É assim que você instala o sshpassapt-get install sshpass
Jan-Terje Sørensen
6
No CentOS éyum -y install sshpass
jgritty
19
A maneira mais segura de fazer isso é com um arquivo de senha , assim: sshpass -f listagens passwdfile` scp [...] . This way, the password won't show up in ps`, etc. e você pode proteger a senha com permissões de arquivo.
Christopher Schultz
50

basta gerar uma chave ssh como:

ssh-keygen -t rsa -C "[email protected]"

copie o conteúdo ~/.ssh/id_rsa.pub e, finalmente, adicione-o às máquinas remotas~/.ssh/authorized_keys

verifique se a máquina remota tem as permissões 0700 for ~./ssh foldere0600 for ~/.ssh/authorized_keys

mustafaturan
fonte
35
Como escrevi: Não, não posso alternar facilmente para autenticação baseada em chave.
Argelbargel # 9/12
3
Você quer dizer .authorized_keys em vez de. notification_keys?
HelloWorld 23/04
2
Um uso válido para isso seria um script bash que faça várias chamadas scp / ssh para um servidor em que você deseja solicitar ao usuário a senha do servidor remoto. A senha não aparecerá no histórico e você ainda poderá desafiar a senha ... mas apenas uma vez. Não quero usar um arquivo de chave porque ainda quero autenticar o usuário do script.
23415 Wes Wes Grant
2
Outro uso válido seria se você não puder ativar facilmente a autenticação baseada em chave no destino. Exemplo: Um dos principais produtores de NAS - o Synology com seu DSM 6.0 - não é compatível até em 2016. Claro, você pode mexer nos arquivos de configuração e esperar que uma atualização não a substitua novamente (a atualização do DSM freqüentemente quebra as modificações personalizadas ) Às vezes - especialmente quando o OP escreve expressamente que eles já sabem que não é o ideal - as pessoas só precisam de uma solução.
Aaa
3
Você deve usar ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>para copiar a chave no servidor remoto
RousseauAlexandre
39

Se você estiver se conectando ao servidor pelo Windows, a versão Putty do scp ("pscp") permitirá que você passe a senha com o -pwparâmetro

Isso é mencionado na documentação aqui.

gWay
fonte
1
Mostre um exemplo, por favor.
precisa saber é o seguinte
Além disso, convém adicionar C: \ Arquivos de Programas (x86) \ PuTTY ao seu caminho para usar esses comandos.
precisa saber é o seguinte
1
@SDsolar aqui está um exemplo de sintaxe: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(eu odeio usando massa como esta, mas funciona)
geneorama
29

curl pode ser usado como uma alternativa ao scp para copiar um arquivo e suporta uma senha na linha de comando.

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/
MBerg
fonte
É muito mais lento que 'scp', mas faz o trabalho bem.
293 Victor
Achei isso mais rápido quando o destino é configurado com um grande atraso no prompt de senha. scptem que esperar mais de 30 segundos para que eu digite uma senha, mas curlfuncionou imediatamente.
Ghost8472
@ Ghost8472 configurado sim, mas às vezes esse atraso está resolvendo o nome do host e também acontece com o sftp.
Mckenzm
1
Eu recebi o "curl: (1) Protocolo" sftp "não suportado ou desativado no libcurl"
kronuus 06/02
21

Você pode usar o script 'expect' no unix / terminal

Por exemplo, crie 'test.exp':

#!/usr/bin/expect
        spawn scp  /usr/bin/file.txt root@<ServerLocation>:/home
        set pass "Your_Password"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }

execute o script

expect test.exp 

Espero que ajude.

Prabhjeet
fonte
7
Pré-requisito: sudo apt-get install expect
SDsolar 23/01
10

Aqui está um exemplo de como você faz isso com a expectferramenta:

sub copyover {
    $scp=Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}
+/$file");
    $scp->expect(30,"ssword: ") || die "Never got password prompt from
+ $dest:$!\n";
    print $scp 'password' . "\n";
    $scp->expect(30,"-re",'$\s') || die "Never got prompt from parent 
+system:$!\n";
    $scp->soft_close();
    return;
}
Espo
fonte
2
Isso está em perl, desculpe, eu não escrevi isso. (5 years ago :))
Espo
3

Você pode usar ssh-copy-idpara adicionar a chave ssh:

$which ssh-copy-id #check whether it exists

Se existir:

ssh-copy-id  "user@remote-system"
Shen JI
fonte
3

Depois de configurar ssh-keygenconforme explicado acima, você poderá

scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/path/in/remote/server/

Se você quiser diminuir a digitação toda vez, poderá modificar seu .bash_profilearquivo e colocar

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/path/in/remote/server/

Então do seu terminal faça source ~/.bash_profile. Depois, se você digitar remote_scpseu terminal, ele deverá executar o scpcomando sem senha.

hi15
fonte
2
  1. verifique se você tem a ferramenta "esperar" antes, se não, faça

    # apt-get install expect

  2. crie um arquivo de script com o seguinte conteúdo. (# vi / root / arquivo de script)

    spawn scp /path_from/file_name user_name_here@to_host_name:/path_to

    expect "password:"

    send put_password_here\n;

    interact

  3. execute o arquivo de script com a ferramenta "expect"

    # expect /root/scriptfile

Kevin Chui
fonte
1

Aqui está um exemplo do tipo Linux / Python / Expect de um pobre, baseado neste post do blog: Atualizando shells simples para TTYs totalmente interativos . Eu precisava disso para máquinas antigas nas quais não consigo instalar o Expect ou adicionar módulos ao Python.

Código:

(
    echo 'scp [email protected]:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

python -c 'import pty; pty.spawn("/usr/bin/bash")'

Resultado:

scp [email protected]:install.sh .
bash-4.2$ scp [email protected]:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit
JohnMudd
fonte
0

Uma alternativa seria adicionar a metade pública da chave do usuário ao arquivo de chaves autorizadas no sistema de destino. No sistema do qual você está iniciando a transferência, é possível executar um daemon ssh-agent e adicionar a metade privada da chave ao agente. O trabalho em lotes pode ser configurado para usar o agente para obter a chave privada, em vez de solicitar a senha da chave.

Isso deve ser possível em um sistema UNIX / Linux ou na plataforma Windows usando pageant e pscp.

rjray
fonte
4
A pergunta dizia que ele não pode usar autenticação baseada em chave.
Barmar 30/09/15
2
Além disso, se fosse eu, presumo que não posso alterar o outro servidor - tudo o que quero é copiar um arquivo.
precisa saber é o seguinte
-1

Todas as soluções mencionadas acima podem funcionar apenas se você instalou o aplicativo ou se você possui os direitos de administrador para instalar, exceto ou sshpass.

Eu encontrei este link muito útil para simplesmente iniciar o scp em segundo plano.

$ nohup scp file_to_copy user@server:/path/to/copy/the/file > nohup.out 2>&1

https://charmyin.github.io/scp/2014/10/07/run-scp-in-background/

Yash
fonte
1
Como a execução do scp em segundo plano inseria a senha?
thomas.han 28/04
-3

etapas para obter o sshpass Para rhel / centos 6:

# wget http://epel.mirror.net.in/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install sshpass

fonte: https://community.mapr.com/thread/9040

Longo
fonte
-9

Encontrei esta resposta realmente útil aqui .

rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

Não apenas você pode passar a senha para lá, mas também mostrará a barra de progresso ao copiar. Realmente fantástico.

valk
fonte
22
e como exatamente você está fornecendo a senha aqui?
Infografnet