Страница 1 из 1

Почему при запуске sh файла не монтируется удаленная директория (sshfs)?

Добавлено: 06 апр 2024, 22:19
sasha300
:hi2:
Есть bash скрипт:

Код: Выделить всё

#!/bin/bash
sshfs -o IdentityFile=/home/user/.ssh/key user@x.x.x.x:/home/user/ /media/temp/
который запускаю через терминал, ключ ssh требует парольную фразу, ввожу ее и монтируемая директория видна в системе.
Хотелось бы, чтобы кликнув на этот sh файл, скрипт успешно отрабатывал команду. Но он не срабатывает, так как требуется пароль, а окно для ввода пароля не появляется и облом :dash2:
Тогда надо вызвать терминал и вставить вышеперечисленную команду. Пишу так:

Код: Выделить всё

#!/bin/bash
xfce4-terminal -e 'sshfs -o IdentityFile=/home/user/.ssh/key user@x.x.x.x:/home/user/ /media/temp/' &
но и тут облом, терминал открывается, парольную фразу спрашивает, на мгновение монтирование происходит и терминал закрывается, не понятно, я ведь в конце поставил амперсанд, команда должна выполняться в фоне!
Вобщем то ли лыжи не едут..
Подскажите, пожалуйста, где затык?
Заранее признателен за вектор!

Почему при запуске sh файла не монтируется удаленная директория (sshfs)?

Добавлено: 06 апр 2024, 23:54
slant
Если ключ с парольной защитой - его нельзя использовать в не интерактивных сеансах просто так (сама ssh не дает - небезопасно. А такой запуск как вы хотите - это как раз не интерактивный сеанс получается).
Можно попробовать добавить его в систему через ssh-agent (после чего -o IdentityFile=/home/user/.ssh/key уже не нужно указывать в самой команде sshfs). Тогда, по идее, работать будет.

Но вообще - а вам пароль на ключе точно нужен? В большинстве случаев оно излишне, и ключ делают для того, чтобы пароль не вводить каждый раз. :) Так то у ssh по паролю вход и без ключа достаточно надежная штука...

Но это так, в общем. А по истории с терминалом - это у вас, как и у многих, есть недопонимание: что такое фоновое выполнение. & - это действительно запуск фоном, в отдельном потоке. Но такой запуск не отменяет правила - у каждого процесса должен быть родитель. Если родитель пропадает (завершает работу) - ядро прибьет все его дочерние процессы тоже. Процесс без родителя - это ненормальное состояние, обозначается как zombie процесс. Обычно наличие такового говорит о том, что в системе что-то не совсем здраво работает. :) В нормальной ситуации у всех процессов общая иерархия - там можно проследить цепочку родителей любого процесса до процесса с PID 1.
Так вот - ваш скрипт запускает команду в отдельном потоке, а сам завершает работу (т.к. именно в этом смысл отдельного потока - не нужно ждать результата его работы.) И разумеется дочерний поток тут же умирает вместе с ним.

Есть два выхода из ситуации. Первый - костыльный, через nohup (читайте мануал по команде, в кратце - она принудительно меняет процессу родителя отвязывая процесс от настоящего родителя).
Второй кошерный - через создание юнита systemd, чтобы ваше соединение стало сервисом, который можно поднять или выключить через стандартную команду (а вот ее уже можно и с ярлыка дергать без проблем.)

Сервис (юнит) пишется достаточно просто. Вот тут достаточно подробно про всю эту кухню (да и вообще в сети много по этой теме):
https://losst.pro/upravlenie-sluzhbami-linux
Вам нужен раздел про пользовательские сервисы (можно и общесистемным сделать, но тогда пароль суперюзера будет просить каждый раз.)

Почему при запуске sh файла не монтируется удаленная директория (sshfs)?

Добавлено: 07 апр 2024, 16:38
sasha300
Почему-то уведомление об ответе на мыло не пришло..
slant писал(а):
06 апр 2024, 23:54
А такой запуск как вы хотите - это как раз не интерактивный сеанс получается).
Ну как не интерактивный, а что открывается терминал и вводиться требуемая команда и я даже ввожу парольную фразу это разве не интерактив? (раз вы подразумеваете, что это не интерактивный сеанс, то так оно и есть, но для меня это не понятка)
slant писал(а):
06 апр 2024, 23:54
Можно попробовать добавить его в систему через ssh-agent (после чего -o IdentityFile=/home/user/.ssh/key уже не нужно указывать в самой команде sshfs).
ну это будет работать и в .ssh/config это так сделано, но в скрипте я предпочитаю видеть параметры подключения в одном месте, без переменных. При обычном подключении ssh, я ввожу "ssh название_подключения", ввожу парольную фразу и сразу же подключаюсь, но это уже малеха другое.
slant писал(а):
06 апр 2024, 23:54
Но вообще - а вам пароль на ключе точно нужен?
Он очень желателен.

Про nohub и юнит отдельный респект!

Почему при запуске sh файла не монтируется удаленная директория (sshfs)?

Добавлено: 08 апр 2024, 00:25
slant
sasha300 писал(а):
07 апр 2024, 16:38
Ну как не интерактивный
Интерактивный сеанс - это вывод приглашения командной строки (bash/sh), и ожидание ввода команд.
Не интерактивный - запуск скрипта и завершение выполнения интерпретатора после его окончания. То, что этим скриптом запускаются команды требующие ввода с клавиатуры - сути дела уже не меняет, т.к. bash/sh уже запущены в режиме исполнения скрипта (не интерактивном).

Разница задается в момент запуска интерпретатора (каким образом это сделано, с какими ключами). Если вы сначала открыли консоль, ввели там имя скрипта и нажали enter - это все еще интерактивный сеанс (скрипт будет выполняться в текущем сеансе как последовательность команд).
А вот запуск скрипта двойным кликом с рабочего стола - не интерактивный. Т.к. здесь уже вызывается bash сразу с указанием - просто выполнить скрипт и все. Так же, не интерактивным сеансом будет запуск запуск скрипта с & на конце - там запустится новая копия bash в отдельном процессе - с задачей просто выполнить скрипт.

В чем разница? При интерактивном сеансе задаются переменные пользовательского окружения. В не интерактивном - нет.

Почему при запуске sh файла не монтируется удаленная директория (sshfs)?

Добавлено: 10 апр 2024, 17:50
sasha300
slant писал(а):
06 апр 2024, 23:54
Второй кошерный - через создание юнита systemd, чтобы ваше соединение стало сервисом, который можно поднять или выключить через стандартную команду (а вот ее уже можно и с ярлыка дергать без проблем.)
я правильно понимаю, что при создании юнита, все-равно придется выключать парольную фразу? По идее это не интерактивный сеанс, поэтому парольная фраза непрокатит, но это мои домыслы..

Почему при запуске sh файла не монтируется удаленная директория (sshfs)?

Добавлено: 10 апр 2024, 19:32
slant
Таки да, не интерактивный.
Но если вы ключ занесете в keyring или добавите в ssh-agent - то это все же обходится. Пароль ключа будет запрашиваться отдельно, заранее, и действовать до завершения сеанса пользователя в системе.