Имя пользователя и пароль в командной строке с помощью sshfs

15

Я создаю небольшой скрипт резервного копирования, используя sshfs:

sshfs backup_user@target_ip:/home /mnt/backup

Есть ли способ включить пароль в эту команду?

Или есть другое решение для передачи файлов, в котором может быть указан пароль для входа, отличный от FTP / SFTP?

Заза
источник
4
Вы можете использовать ssh-gkeygen для генерации пары ключей RSA, а затем настроить ssh (клиент и сервер) для использования аутентификации RSA. Вы делали это раньше для "обычной" аутентификации ssh?
Airhuff
да, но тогда я должен изменить способ подключения серверов через ssh .. насколько я знаю, аутентификация может основываться на ключах или логин / пароль не одновременно ...
Zaza
2
Они могут быть оба. Они обычно есть. Таким образом, вновь созданный пользователь может нажать свой ключ на сервере, введя свой пароль. Впоследствии они используют свой ключ.
Ксиэнн

Ответы:

11

-o password_stdinпохоже не работает на всех системах, например на freeBSD. и т.д.

Вы также можете использовать expect Интерпретатор, он должен работать с sshfs и делать свое дело.

Другое решение sshpass, например, скажем, что вы создаете резервную копию каталога / var / www

Резервное копирование:

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

загрузка файла резервной копии на сервер резервного копирования

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

Таким образом, он будет загружать каталог с сегодняшним резервным копированием.

Но все же, как было сказано выше, лучший (безопасный и простой) способ - использовать пару ключей ssh
. Единственное неудобство заключается в том, что вам придется проходить процесс генерации ключа один раз на каждом сервере. вам нужно создать пару, но это лучше, чем хранить пароль в текстовом формате на всех серверах, для которых вы хотите создать резервную копию :),

правильно создать пару ключей

  • На локальном сервере

    ssh-keygen -t rsa
    
  • На удаленном сервере

    ssh root@remote_servers_ip "mkdir -p .ssh"
    
  • Загрузка сгенерированных открытых ключей на удаленный сервер

    cat ~/.ssh/id_rsa.pub | ssh root@remote_servers_ip "cat >> ~/.ssh/authorized_keys"
    
  • Установить разрешения на удаленном сервере

    ssh root@remote_servers_ip "chmod 700 ~/.ssh; chmod 640 ~/.ssh/authorized_keys"
    
  • Авторизоваться

    ssh root@remote_servers_ip
    
  • Включение протокола SSH v2

    раскомментируйте "Протокол 2" в / etc / ssh / sshd_config

  • включение авторизации с открытым ключом в sshd

    раскомментируйте "PubkeyAuthentication yes" в / etc / ssh / sshd_config

  • Если StrictModes установлен в yes в / etc / ssh / sshd_config, тогда

    restorecon -Rv ~/.ssh
    
Drakonoved
источник
14

Согласно руководству, существует опция, -o password_stdinкоторая может позволить считывать пароль из стандартного ввода, что, вероятно, может быть перенаправлением. Я никогда не использовал это, поэтому я размышляю.

Тем не менее, я настоятельно рекомендую против такого решения, которое по своей сути небезопасно.

sshочень хорошо работает с системой закрытых / открытых ключей. Это просто и безопасно. Нет необходимости вводить пароль или писать его в открытом виде в сценарии оболочки. Просто нажмите ваш открытый ключ на сервере, и вы можете подключиться немедленно.

xhienne
источник
Кто-нибудь может привести рабочий пример этого решения? Я пытаюсь следующее, но это не работает:printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
MikeyE
К вашему сведению, я должен был упомянуть, что использую защищенный паролем ключ SSH. Я смог заставить его работать, используя ответ, предоставленный @ nathan-s-watson-haigh, который можно найти здесь: unix.stackexchange.com/questions/128974/…
MikeyE
У меня нет подходящей среды, которая позволила бы мне протестировать ssfs-mount с защищенным паролем ключом SSH. В любом случае, первое, что поражает меня в вашей команде, это то, что я не вижу никакой -o password_stdinвозможности.
Xhienne
Спасибо за вклад. Я только что попробовал следующую команду, и она не запрашивает пароль, но также не возвращает. Это означает, что он просто ждет, пока команда завершится, а командная строка не отображается. Я попробовал команду: printf "my_password\n" | sshfs -o password_stdin user@hostname:/ $HOME/local_dir PS Я нахожусь на Debian Buster PPS. Это работает, но запрашивает пароль:sshfs -o password_stdin user@hostname:/ $HOME/local_dir
MikeyE
11

Конвейеру "sshfs password"с <<<к -o password_stdinработам на баш:

sshfs -o password_stdin backup_user@target_ip:/home /mnt/backup <<< "sshfs password"
Маз
источник
4
Это должен быть принятый ответ .. работает на любой ОС Linux.
аргон
Итак, как поместить его в файл mnt-media.mount для автоматического монтирования с помощью systemd?
Жоао Жозе
Один супер второстепенный комментарий: если ваш пароль содержит специальные символы BASH (например, удар (!)), То вы должны использовать одинарные кавычки вместо двойных кавычек для пароля.
Кайл Чаллис
5
echo 'password' | sshfs user@host:/dir /mnt -o password_stdin

Опция "-o password_stdin" - это то, что позволяет вам передать ваш пароль.

Тем не менее, ключи являются лучшим вариантом, если только ваш поставщик услуг не разрешает вам использовать их для sftp. (Это одна из заметных ошибок WP Engine.)

iateadonut
источник
Не могли бы вы уточнить ваш ответ. Только одна строка кода не считается в SE хорошим ответом
Ромео Нинов
@RomeoNinov Я бы сказал, что этот пост достаточно хорошо отвечает на вопрос. Не каждый склонен писать роман, объясняющий, почему очевидное очевидно.
Satō
@SatoKatsura Спасибо. Хотя я готов принять вызов.
iateadonut
2

Сценарий монтирования:

#!/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"

Отсоединение:

#!/bin/bash

mount=$(pwd)/sshfs

fusermount -u $mount
Майкл
источник
1

Следует иметь в виду, что если вы используете эту -o password_stdinопцию, она может не работать, потому что sshfs спросит, подключаться к хосту или нет (если вы подключаетесь к нему в первый раз и он не добавлен) к известному файлу hosts еще). Если вы запускаете его в пакете, вы никогда не увидите sshfs, спрашивающего. Обходные пути, чтобы избежать этого:

  1. добавить -o StrictHostKeyChecking=noопцию в sshfs или
  2. Запустите sshfs вручную один раз, чтобы добавить хост в файл известных хостов.
frenchie71
источник
0

Автоматический скрипт для соединения sftp с sshfs

#!/bin/bash
expect <<END
spawn sshfs sftpuser@ip:/folder /mnt/folder -p 22 -o password_stdin
send "password\r"
expect eof
END
Чампа
источник