Nome de usuário e senha na linha de comando com sshfs

15

Estou criando um pequeno script de backup usando sshfs:

sshfs backup_user@target_ip:/home /mnt/backup

Existe uma maneira de incluir a senha neste comando?

Ou existe outra solução de transferência de arquivos em que a senha de login pode ser incluída além de FTP / SFTP?

Zaza
fonte
4
Você pode usar ssh-gkeygen para gerar um par de chaves RSA e configurar o ssh (cliente e servidor) para usar a autenticação RSA. Você já fez isso antes para autenticação ssh "regular"?
airhuff
sim, mas então eu tenho que mudar a forma como os servidores estão se conectando via ssh .. tão longe Eu sei autenticação pode ser chave base ou login / senha não os dois ao mesmo tempo ..
Zaza
2
Eles podem ser os dois. Eles geralmente são. Dessa forma, um usuário recém-criado pode pressionar sua chave no servidor digitando sua senha. Posteriormente, eles usam sua chave.
xhienne

Respostas:

11

-o password_stdinnão parece estar funcionando em todos os sistemas, por exemplo, freeBSD. etc.

Você também pode usar o expect Intérprete, ele deve funcionar com sshfs e deve fazer o truque.

Outra solução seria sshpass, por exemplo, digamos que você esteja fazendo o backup do diretório / var / www

Fazendo backup:

name=$(date '+%y-%m-%d')
mkdir /backup/$name && tar -czvf /backup/$name/"$name.tar.gz" /var/www

fazendo upload de arquivo de backup para o servidor de backup

sshpass -p "your_password" scp -r backup_user@target_ip:/home/ /backup/$name

Por isso vai fazer upload de diretório com o backup de hoje

Mas ainda assim, como foi dito mais alto, melhor (seguro e simples) caminho seria usar ssh par de chaves
O único inconveniente seria que você tem que passar pelo processo de geração de chaves, uma vez em cada servidor é necessário emparelhar, mas é melhor do que manter uma senha em formato de texto sem formatação em todos os servidores que você deseja fazer backup :),

Gerando um par de chaves da maneira correta

  • No servidor local

    ssh-keygen -t rsa
    
  • No servidor remoto

    ssh root@remote_servers_ip "mkdir -p .ssh"
    
  • Upload de chaves públicas geradas para o servidor remoto

    cat ~/.ssh/id_rsa.pub | ssh root@remote_servers_ip "cat >> ~/.ssh/authorized_keys"
    
  • Definir permissões no servidor remoto

    ssh root@remote_servers_ip "chmod 700 ~/.ssh; chmod 640 ~/.ssh/authorized_keys"
    
  • Conecte-se

    ssh root@remote_servers_ip
    
  • Ativando o Protocolo SSH v2

    descomente o "Protocolo 2" em / etc / ssh / sshd_config

  • habilitando a autorização de chave pública no sshd

    descomente "PubkeyAuthentication yes" em / etc / ssh / sshd_config

  • Se StrictModes estiver definido como yes em / etc / ssh / sshd_config,

    restorecon -Rv ~/.ssh
    
Drakonoved
fonte
14

De acordo com o manual, existe uma opção -o password_stdinque pode permitir a leitura da senha da entrada padrão, o que provavelmente pode ser um redirecionamento. Eu nunca usei, então estou especulando.

Dito isto, aconselho vivamente a essa solução que é inerentemente insegura.

sshfunciona muito bem com um sistema de chaves públicas / privadas. É simples e seguro. Não é necessário digitar uma senha ou escrevê-la em um script de shell. Basta pressionar sua chave pública no servidor e você poderá se conectar imediatamente.

xhienne
fonte
Alguém pode fornecer um exemplo de trabalho desta solução? Estou tentando o seguinte, mas ele não está funcionando:printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
MikeyE
Para sua informação, eu deveria ter mencionado que estou usando uma chave SSH protegida por senha. Eu era capaz de fazê-lo funcionar usando a resposta dada por @ Nathan-s-watson-haigh encontrada aqui: unix.stackexchange.com/questions/128974/...
MikeyE
Não tenho nenhum ambiente correspondente em mãos que permita testar uma montagem ssfs com uma chave SSH protegida por senha. De qualquer forma, o que mais me impressiona no seu comando é que não vejo nenhuma -o password_stdinopção.
Xhienne 10/07
Obrigado pela contribuição. Tentei o comando a seguir agora e ele não pede uma senha, mas também não retorna. Ou seja, ele fica lá aguardando a conclusão do comando, nenhum prompt de comando é exibido. Eu tentei o comando: printf "my_password\n" | sshfs -o password_stdin user@hostname:/ $HOME/local_dir PS eu estou no Debian Buster PPS Isso funciona, mas solicitará uma senha:sshfs -o password_stdin user@hostname:/ $HOME/local_dir
MikeyE
11

Piping the "sshfs password"with <<<para -o password_stdintrabalhos no bash:

sshfs -o password_stdin backup_user@target_ip:/home /mnt/backup <<< "sshfs password"
Maz
fonte
4
Essa deve ser a resposta aceita .. funciona em qualquer sistema operacional Linux.
argon
então, como colocá-lo no arquivo mnt-media.mount para montagem automática com o systemd?
João José
Um comentário super menor: se sua senha tiver caracteres BASH especiais (como um estrondo (!)), Você deve usar aspas simples em vez de aspas duplas para a senha.
Kyle Challis
5
echo 'password' | sshfs user@host:/dir /mnt -o password_stdin

A opção "-o password_stdin" é o que permite canalizar sua senha.

Dito isto, as chaves são uma opção melhor, a menos que seu provedor de serviços não permita que você as use para sftp. (Essa é uma das falhas notáveis ​​do WP Engine.)

iateadonut
fonte
Você pode esclarecer sua resposta. Apenas uma linha de código não contam em SE como resposta boa
Romeo Ninov
@RomeoNinov Eu diria que este post responde a pergunta bem o suficiente. Nem todo mundo está inclinado a escrever um romance explicando por que o óbvio é óbvio.
Satō Katsura
@SatoKatsura Thanks. Estou pronto para o desafio, no entanto.
iateadonut
2

Script de montagem:

#!/bin/bash
server=<host>
user=<username>
pass=<password>
root=<hostpath>
mount=$(pwd)/sshfs

type sshfs >/dev/null 2>&1 || { echo >&2 "sshfs required"; exit 1; }
type sshpass >/dev/null 2>&1 || { echo >&2 "sshpass required"; exit 1; }

mkdir -p $mount

SSHPASS="$pass" sshfs $server:$root $mount -o ssh_command="sshpass -e ssh -l $user"

Desmontar:

#!/bin/bash

mount=$(pwd)/sshfs

fusermount -u $mount
Michael
fonte
1

uma coisa a ter em mente é que, se você estiver usando a -o password_stdinopção, ela pode parecer não estar funcionando porque o sshfs perguntará se deseja se conectar ao host ou não (se é a primeira vez que você se conecta a ele e não é adicionado) para o arquivo hosts conhecido ainda). Se você estiver executando em um lote, nunca verá os sshfs perguntando. As soluções alternativas para evitar isso são:

  1. adicione a -o StrictHostKeyChecking=noopção ao sshfs ou
  2. execute sshfs manualmente uma vez para adicionar o host ao arquivo de hosts conhecidos
frenchie71
fonte
0

Script automático para conectar sftp com sshfs

#!/bin/bash
expect <<END
spawn sshfs sftpuser@ip:/folder /mnt/folder -p 22 -o password_stdin
send "password\r"
expect eof
END
champa
fonte