Практическое руководство выполняет интерактивные команды как другой пользователь

Я советую Вам фиксировать свои окончания строки.

Преобразовать файл в \n окончания строки:

:%s/\r$

Преобразовать файл в \r\n окончания строки (не протестированы):

:%s/[^\r]\n/\r\n/

Можно заставить энергию выполнить одну из этих операций автоматически при открытии файла:

autocmd BufRead, * normal :%s/\r$

Вы могли также использовать dos2unix и unix2dos утилиты.

4
17.04.2019, 01:38
3 ответа
 sudo su - <<'EOF']
# do stuff...
EOF

Это работает, но с ограничением: скрипт передается в оболочку на стандартном входе, так что вы не сможете использовать стандартный вход для чего-то другого, например, для чтения имени пользователя для создания.

Простой способ сохранить стандартный вход - передать команду оболочки в качестве аргумента.

Обратите внимание, что sudo su является избыточным - sudo выполняет указанную команду от имени root, и это единственное предназначение su. Используйте sudo -i вместо sudo su -, если вы хотите запустить оболочку от имени root - что, вероятно, здесь не нужно - или sudo sh, чтобы просто запустить оболочку от имени root.

sudo sh -c '
  # do stuff...
'

Это делает неудобным использование одиночной кавычки в фрагменте оболочки. Вы можете использовать '\'', чтобы поместить одиночную кавычку внутрь однокавычного литерала. Если вы хотите сохранить здесь структуру документа, есть несколько способов. Самый простой - передать здесь документ на другой дескриптор. Однако для этого в конфигурации sudo должна быть активирована опция closefrom_override, что по умолчанию не так; по умолчанию sudo закрывает все файловые дескрипторы, кроме stdin, stdout и stderr.

sudo -C 3 sh -c '. /dev/fd/3' 3<<'EOF'
# do stuff...
EOF

Если вы хотите, чтобы ваш код был переносимым на машины, где эта опция не активирована, вы можете прочитать скрипт из heredoc и передать его в оболочку в качестве аргумента.

script=$(cat <<'EOF'
# do stuff...
EOF
)
sudo sh -c "$script"

Кроме того, если вы хотите, чтобы sudo скрипт мог читать из терминала, вы можете передать тело скрипта на стандартном входе. Ограничением такого подхода является то, что он не позволяет перенаправлять ввод общего скрипта.

sudo sh <<'EOF'
exec </dev/tty
# do stuff...
EOF
5
27.01.2020, 20:56
su -c '. /dev/fd/4' 4<<\SCRIPT
    ...automated stuff here...
    ....then for interactive...
    exec </dev/tty
SCRIPT

Должен сделать это. Сделайте это в соответствии с вашими потребностями - но он переключит контексты, и статус возврата оболочки будет в $?, когда вы закончите с этим.

.
-2
27.01.2020, 20:56

При условии, что пользователь, ссылающийся на sudo может назначить tty:

Defaults someuser:requiretty

ans было дано разрешение на выполнение необходимых команд в качестве root:

Cmnd_Alias STUFF = /usr/bin/passwd, /usr/sbin/useradd
someuser ALL = STUFF

сценарий, содержащий sudo вызовы, будет интерактивным. Вы можете передать имя пользователя в качестве позиционного аргумента:

sudo useradd $1
sudo passwd $1

и проверить статус возврата, как обычно, с помощью $?.

.
1
27.01.2020, 20:56

Теги

Похожие вопросы