Расширяя эту идею, попробуйте создать файлы .desktop для команд mimeopen -a и mimeopen -d. Это восстанавливает возможность открытия через пользовательскую команду в нужном контекстном меню, хотя вам нужно немного выкопать в меню, чтобы добраться до нее.
Редко бывает неплохо иметь sudo внутри скриптов. Вместо этого удалите sudo из сценария и запустите сам скрипт с помощью sudo:
sudo myscript.sh
Таким образом, все команды в скрипте будут запускаться с привилегиями root, и вам нужно будет только дать пароль один раз при запуске скрипта. Если вам нужна конкретная команда в скрипте, который будет запущен без привилегий sudo, вы можете запустить его как обычного пользователя (спасибо Lie Ryan):
sudo -u username command
Пространство не имеет значения, оно должно ничего не влияет, всегда существует пробел между командой и ее аргументами.
На самом деле существует гораздо более простой способ сделать это.
Введите пароль sudo в качестве параметра при запуске скрипта, захватите его и эхо-повторите с каждой командой, которая будет запрашивать пароль sudo.
#!/bin/bash
PW=$1
echo $PW | ./playback_delete_data_patch.sh 09_delete_old_data_p.sql
./command_wo_sudo.sh <param>
echo $PW | ./other_command_requires_sudo.sh <param>
Вы можете добавить приглашение и захватить после того, как скрипт будет выведен следующим образом:
echo "enter the sudo password, please"
read PW
Но если кто-то еще контролирует, что выполняется на узле ; имеет доступ к созданным им журналам; или просто просматривает ваш случайный случай, когда вы запускаете тест, который может поставить под угрозу безопасность.
Это также работает с запущенными командами / сценариями, для которых требуется продолжить да:
echo $PW | yes | ./install.sh
Эхо в ответ на приглашение, поэтому вы можете использовать все, что вам нужно, там, если вы используете другие сценарии, которые запрашивают прогресс, в последовательном порядке. Удостоверьтесь, что вы знаете этот порядок, хотя или могут произойти плохие вещи.
Этот ответ похож на ответ тердона. Поскольку я также предлагаю запустить основной скрипт с sudo, чтобы вы могли запускать команды, не спрашивая у пользователя ни одного пароля.
Однако, если вы хотите запустить некоторые из команд не как корень пользователь или конкретный системный пользователь, но как фактический пользователь, который выполнил команду с помощью sudo, вы можете проверить переменную $SUDO_USER, чтобы определить оригинального пользователя.
Это пример скрипта как вы могли бы это достичь:
#!/bin/bash
# ref: https://askubuntu.com/a/30157/8698
if ! [ $(id -u) = 0 ]; then
echo "The script need to be run as root." >&2
exit 1
fi
if [ $SUDO_USER ]; then
real_user=$SUDO_USER
else
real_user=$(whoami)
fi
# Commands that you don't want run with root would be invoked
# with: sudo -u $real_user
# So they will be ran as the user who invoked the sudo command
# Keep in mind, if the user is using a root shell (they're logged in as root),
# then $real_user is actually root
# sudo -u $real_user non-root-command
# Commands that need to be ran with root would be invoked without sudo
# root-command
Вы можете изменить файл sudoers.
Запустить sudo visudo.
Добавить запись для вашего имени пользователя и скрипта, который вы хотите запустить, без запроса для пароля.
username ALL=(ALL) NOPASSWD: /path/to/script
Редко бывает неплохо иметь sudo внутри скриптов. Вместо этого удалите sudo из сценария и запустите сам скрипт с помощью sudo:
sudo myscript.sh
Таким образом, все команды в скрипте будут запускаться с привилегиями root, и вам нужно будет только дать пароль один раз при запуске скрипта. Если вам нужна конкретная команда в скрипте, который будет запущен без привилегий sudo, вы можете запустить его как обычного пользователя (спасибо Lie Ryan):
sudo -u username command
Пространство не имеет значения, оно должно ничего не влияет, всегда существует пробел между командой и ее аргументами.
На самом деле существует гораздо более простой способ сделать это.
Введите пароль sudo в качестве параметра при запуске скрипта, захватите его и эхо-повторите с каждой командой, которая будет запрашивать пароль sudo.
#!/bin/bash
PW=$1
echo $PW | ./playback_delete_data_patch.sh 09_delete_old_data_p.sql
./command_wo_sudo.sh <param>
echo $PW | ./other_command_requires_sudo.sh <param>
Вы можете добавить приглашение и захватить после того, как скрипт будет выведен следующим образом:
echo "enter the sudo password, please"
read PW
Но если кто-то еще контролирует, что выполняется на узле ; имеет доступ к созданным им журналам; или просто просматривает ваш случайный случай, когда вы запускаете тест, который может поставить под угрозу безопасность.
Это также работает с запущенными командами / сценариями, для которых требуется продолжить да:
echo $PW | yes | ./install.sh
Эхо в ответ на приглашение, поэтому вы можете использовать все, что вам нужно, там, если вы используете другие сценарии, которые запрашивают прогресс, в последовательном порядке. Удостоверьтесь, что вы знаете этот порядок, хотя или могут произойти плохие вещи.
Этот ответ похож на ответ тердона. Поскольку я также предлагаю запустить основной скрипт с sudo, чтобы вы могли запускать команды, не спрашивая у пользователя ни одного пароля.
Однако, если вы хотите запустить некоторые из команд не как корень пользователь или конкретный системный пользователь, но как фактический пользователь, который выполнил команду с помощью sudo, вы можете проверить переменную $SUDO_USER, чтобы определить оригинального пользователя.
Это пример скрипта как вы могли бы это достичь:
#!/bin/bash
# ref: https://askubuntu.com/a/30157/8698
if ! [ $(id -u) = 0 ]; then
echo "The script need to be run as root." >&2
exit 1
fi
if [ $SUDO_USER ]; then
real_user=$SUDO_USER
else
real_user=$(whoami)
fi
# Commands that you don't want run with root would be invoked
# with: sudo -u $real_user
# So they will be ran as the user who invoked the sudo command
# Keep in mind, if the user is using a root shell (they're logged in as root),
# then $real_user is actually root
# sudo -u $real_user non-root-command
# Commands that need to be ran with root would be invoked without sudo
# root-command
Вы можете попытаться добавить пользователя, который запускает скрипт в файл sudoers:
#give permissions to the file
sudo chmod 700 /etc/sudoers.d/useradm
sudo visudo /etc/sudoers.d/useradm
#add the following text, changing "user" but your desired user
user ALL=(ALL)NOPASSWD:ALL
#return the right permissions to the file
sudo chmod 440 /etc/sudoers.d/useradm
Вы можете изменить файл sudoers.
Запустить sudo visudo.
Добавить запись для вашего имени пользователя и скрипта, который вы хотите запустить, без запроса для пароля.
username ALL=(ALL) NOPASSWD: /path/to/script