Вопрос или проблема
Я хочу смонтировать удаленный каталог и хочу автоматизировать это. Поэтому я написал скрипт ниже, который не работает должным образом.
#!/usr/bin/expect -f
spawn sshfs [email protected]:/home/user /mnt/remote
expect "assword:"
send "myPassword\r"
Когда я запускаю вышеуказанный скрипт и проверяю ls /mnt/remote
, появляется следующая ошибка:
ls: невозможно получить доступ к /mnt/remote: Транспортный конечный пункт не подключен
Я использовал sshpass
, но это не сработало:
sshpass -p myPassword sshfs [email protected]:/home/user /mnt/remote
Оболочка заблокирована и возникает та же ошибка.
Примечание: Если я запускаю sshpass -p vedams123 sshfs [email protected]:/home/user /mnt/remote
, работает без каких-либо проблем.
Это происходит, когда в вашем целевом каталоге есть устаревшая сессия. Вы можете очистить сессию с помощью
fusermount -u /mnt/remote
где /mnt/remote
— это тот путь, к которому настроен ваш локальный монтируемый файл.
Ответ или решение
Автоматизация подключения к удаленным директориям с использованием SSHFS может быть весьма полезной задачей, но она также может вызвать некоторые трудности. Рассмотрим проблему, с которой вы столкнулись, и предложим решения.
Проблема
Вы пытаетесь автоматизировать процесс монтирования удаленной директории с использованием скрипта написанного на expect
и sshpass
, но получаете ошибку:
ls: cannot access /mnt/remote: Transport endpoint is not connected
Эта ошибка обычно указывает на проблемы с соединением или наличие "застрявшей" сессии, которая мешает корректной работе SSHFS.
Решение
Вот несколько шагов, которые могут помочь вам устранить эту проблему:
-
Проверка наличия "застрявших" сессий:
Иногда, когда соединение с удаленным сервером прерывается или не закрывается должным образом, то может остаться "застрянувшая" сессия. Чтобы устранить эту ситуацию, выполните следующую команду:fusermount -u /mnt/remote
Данная команда отключит монтированную директорию
sshfs
и позволит вам начать процесс заново. -
Оптимизация скрипта:
Ваш оригинальный скрипт наexpect
может быть улучшен для надежной автоматизации. Также рекомендуется избегать хранения паролей в явном виде. Более безопасный подход – настроить ключи SSH для аутентификации. Однако, если вы всё же хотите использовать пароли, вот пересмотренный вариант вашего скрипта:#!/usr/bin/expect -f set timeout -1 spawn sshfs [email protected]:/home/user /mnt/remote expect { "assword:" { send "myPassword\r" exp_continue } "yes/no" { send "yes\r" exp_continue } }
Обратите внимание, что в этом скрипте управляется ситуацией, когда система запрашивает подтверждение (yes/no) для нераспознанного ключа SSH.
-
Использование sshpass:
Если вы хотите использоватьsshpass
, вам следует убедиться, что самsshpass
установлен, и команда выполняется корректно. Скрипт может быть следующим:sshpass -p "myPassword" sshfs [email protected]:/home/user /mnt/remote
Убедитесь, что пароль заключен в кавычки, чтобы избежать проблем с символами, которые могут быть интерпретированы как специальные символы в командной оболочке.
-
Настройка ключей SSH:
Оптимальным вариантом будет использование публичных и приватных SSH-ключей. Следуйте следующим шагам для их настройки:- Создайте ключ с помощью команды
ssh-keygen
. - Скопируйте публичный ключ на удаленный сервер с помощью
ssh-copy-id [email protected]
.
Благодаря этому вы сможете подключаться без ввода пароля.
- Создайте ключ с помощью команды
-
Проверка работы:
После выполнения всех этих шагов проверьте атрибуты монтирования:df -h | grep /mnt/remote
Убедитесь, что он отображается в выводе, что означает корректное соединение.
Заключение
Автоматизация монтирования с использованием SSHFS может потребовать некоторых усилий, особенно при работе с аутентификацией и сетевыми соединениями. Следуя вышеперечисленным рекомендациям, вы сможете успешно настроить автоматизированное соединение. Если у вас остались проблемы, обратите внимание на сетевые настройки и права доступа к директориям. Если возникнут дополнительные вопросы, не стесняйтесь задавать их!