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

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
sasha300
Сообщения: 137
Зарегистрирован: 31 мар 2023, 08:56
Решено: 6
Откуда: СПб
Благодарил (а): 99 раз
Поблагодарили: 6 раз
Контактная информация:

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

#1

06 апр 2024, 22:19

: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/' &
но и тут облом, терминал открывается, парольную фразу спрашивает, на мгновение монтирование происходит и терминал закрывается, не понятно, я ведь в конце поставил амперсанд, команда должна выполняться в фоне!
Вобщем то ли лыжи не едут..
Подскажите, пожалуйста, где затык?
Заранее признателен за вектор!

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

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

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

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

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

Перейти к ответу ➙
LM 21.3 Xfce HW probe

Аватара пользователя

slant
Сообщения: 4522
Зарегистрирован: 21 июн 2017, 18:09
Решено: 99
Благодарил (а): 51 раз
Поблагодарили: 1998 раз
Контактная информация:

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

#2

06 апр 2024, 23:54

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

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

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

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

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

Аватара пользователя

Автор темы
sasha300
Сообщения: 137
Зарегистрирован: 31 мар 2023, 08:56
Решено: 6
Откуда: СПб
Благодарил (а): 99 раз
Поблагодарили: 6 раз
Контактная информация:

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

#3

07 апр 2024, 16:38

Почему-то уведомление об ответе на мыло не пришло..
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 и юнит отдельный респект!
LM 21.3 Xfce HW probe

Аватара пользователя

slant
Сообщения: 4522
Зарегистрирован: 21 июн 2017, 18:09
Решено: 99
Благодарил (а): 51 раз
Поблагодарили: 1998 раз
Контактная информация:

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

#4

08 апр 2024, 00:25

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

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

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

Аватара пользователя

Автор темы
sasha300
Сообщения: 137
Зарегистрирован: 31 мар 2023, 08:56
Решено: 6
Откуда: СПб
Благодарил (а): 99 раз
Поблагодарили: 6 раз
Контактная информация:

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

#5

10 апр 2024, 17:50

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

Аватара пользователя

slant
Сообщения: 4522
Зарегистрирован: 21 июн 2017, 18:09
Решено: 99
Благодарил (а): 51 раз
Поблагодарили: 1998 раз
Контактная информация:

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

#6

10 апр 2024, 19:32

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

Ответить

Вернуться в «Программирование, скриптинг, виртуализация»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость