Как выводить команды в другой файл

Я хочу сделать эхо от одного сценария к другому сценарию, но я не хочу получать выходные данные команды, потому что я хочу использовать эту команду в другом сценарии, мне нужно создать сценарий, который создает adduser. местный сценарий для меня.

Первый скрипт:

#!/bin/bash
sudo echo "
#!/bin/bash
'lastuser="$(grep home /etc/passwd | cut -d: -f 1 | tail -1)"' " >>
/usr/local/sbin/adduser.local

, и то, что я получаю из /usr/local/sbin/adduser.local, является выводом команды, и я хочу скопировать команду как есть, потому что я Я не хочу получить вывод в первом скрипте. Я хочу получить вывод во втором скрипте. Поэтому мне нужно знать, как правильно использовать echo, чтобы первый скрипт отбрасывал команду как есть в adduser.local.

Скрипт adduser.local должен выглядеть так после первого запуска

#!/bin/bash
lastuser="$(grep home /etc/passwd | cut -d: -f 1 | tail -1)"
#and now i can use the $lastuser in this script
echo " '$lastuser' ALL = !/usr/bin/apt-get update " >> /etc/sudoers
1
задан 11 July 2019 в 23:44

2 ответа

Вы, вероятно, не должны делать этого. Можно, вероятно, достигнуть цели способом, который не включает запись одного сценария, который генерирует другой сценарий, который Вы позже измените и выполните; посмотрите ниже. Но если Вы действительно хотите сделать это, и Вы хотите сделать это с кодом, который тесно напоминает то, что Вы показали, затем steeldriver является правильным, что здесь документ является осуществимым путем.

Путь steeldriver использует здесь, документ прекрасен; вот другой, код которого немного более прост. (Я представляю его главным образом для возможности объяснить значение каждой части его синтаксиса, не из веры, что этот подход выше.)

#!/bin/bash
cat >/usr/local/sbin/adduser.local <<'EOF'
#!/bin/bash
lastuser="$(grep home /etc/passwd | cut -d: -f 1 | tail -1)"
EOF

Замена /usr/local/sbin/adduser.local с любым именем Вы хотите для второго сценария, если это отличается. Затем просто запустите скрипт как корень, например, с sudo. Весь смысл этого сценария должен создать файл в месте, только базируются, имеет доступ для записи к, таким образом, это - самостоятельно вид команды, которая имеет смысл работать как корень с sudo. Когда у Вас есть сценарий, в котором каждая команда запускается с sudo (особенно, если это - один командный сценарий), который часто предлагает, чтобы сценарий не должен был использовать sudo в нем вообще, но должен вместо этого просто быть выполнен с sudo.

В зависимости от того, как Вы запускаете сгенерированный скрипт, Вы, возможно, должны дать его, выполняют полномочия, с которыми можно сделать chmod +x. (Который относится к пути steeldriver, также.), Если файл уже существует и имеет, выполняют полномочия, и Вы перезаписываете его, затем Вы не должны работать chmod.

Путем команда, показанная выше работ, состоит в том что:

  • Когда cat выполняется без аргументов имени файла (как имеет место здесь), это просто копирует свой вход в его вывод.
  • catвывод перенаправляется в файл /usr/local/sbin/adduser.local оператором перенаправления вывода >. Я использовал > оператор, который перезаписывает, даже при том, что Вы использовали >>, который добавляет. Я делаю это, потому что я предполагаю, что Вы хотите перезаписать тот файл, потому что текст, который Вы помещаете в него, запускается с hashbang, который обычно не имеет смысла кроме в начале файла.
  • catвход взят из текста, который появляется на следующей строке, до, но не не включая любую строку, которая начинается EOF, предусмотренный здесь нотацией документа <<.
  • Заключение в кавычки EOF после << - то есть, запись <<'EOF' вместо <<EOF - подавляет расширения в теле здесь документ, так, чтобы ни один из символов в коде удара там не рассматривала особенно оболочка, запускающая первый скрипт.

Используя здесь документ устраняет трудности, связанные с кавычками, которые вкладываются в других кавычках. Если Вам когда-нибудь нужно тело здесь документ для содержания EOF, это прекрасно, потому что хотя EOF один из популярного выбора слова, это не является особенным вообще. Можно использовать любое слово, которое Вы любите. Просто используйте его оба после << и в начале строки, которая появляется отдельно после последней строки, которую Вы хотите обеспечить, как введено - так же, как EOF используется выше.


Существует несколько причин, Вы не должны, вероятно, на самом деле делать этого (ни использовать любого echo- основанный метод) в ситуации Вы, кажется, описываете.

Во-первых, если Ваша цель состоит в том, чтобы позволить некорневым пользователям устанавливать обновления, редактируя sudoers не мог бы быть лучший способ достигнуть этого. Существуют другие подходы; например, можно запланировать обновления для автоматической установки без сопровождения или позволить некорневым пользователям использовать менеджера по обновлению, и можно интересоваться этой техникой или некоторой вариацией на нее. Я не уверен вполне, каковы Ваши требования, но Вы могли бы хотеть спросить о любой определенной проблеме, которую Вы пытаетесь решить.

Во-вторых, если Вы действительно заканчиваете тем, что редактировали /etc/sudoers, это обычно плохо, чтобы сделать настолько способом, который не включает автоматически проверку синтаксические ошибки и отклонение модификаций, которые представляют их. (Также часто лучше создать или отредактировать sudoers файл в /etc/sudoers.d каталог вместо того, чтобы изменить основной sudoers файл /etc/sudoers, но те же предостережения и соображения применяются.), Когда Вы вручную редактируете sudoers файл с visudo команда, такие проверки выполнены; файл, который Вы редактируете, не является реальным sudoers файлом, но является вместо этого временным файлом, который проверяется и только копируется в реальный sudoers файл после передачи проверок синтаксиса.

Малейшая синтаксическая ошибка в любом sudoers файле заставляет sudo отказываться позволять любому выполнять действия как корень! Это часто легко зафиксировать, но если причина, Вы не используете находящийся в Polkit подход, состоит в том, что это - система сервера без Polkit, затем это немного более твердо. Если необходимо отредактировать sudoers файл не через visudo, можно принять предупредительную меру открытия корневой оболочки, отдельной от оболочки, в которой Вы выполняете команды, которые изменяют Вашу конфигурацию, такой как путем выполнения sudo -i. После того, как запущенный, это останется применимым, столько, сколько это работает, даже если sudo повреждается.

Можно на самом деле использовать visudo проверять синтаксическую правильность автоматизированных, модификаций в виде сценария в sudoers файлы! Это возможно, потому что это принимает, что любая команда как текстовый редактор использует для редактирования файла; это может быть настроено для единственного выполнения visudo использование SUDO_EDITOR переменная среды, и можно записать сценарий, который ведет себя как тот редактор, но автоматизирован и не требует никаких взаимодействий (кроме, возможно, если она производит синтаксическую ошибку это visudo блоки). Я рассмотрел бы детали вне объема этого ответа; если Вы хотите справку, делающую что-то как этот, Вы могли бы задать другой вопрос об этом.

В-третьих, похоже, что Вы планируете добавить несколько (возможно, многие) записи в sudoers файл для отдельных пользователей. Если так, необходимо рассмотреть добавление однократного въезда для группы и добавления пользователей группе. Это - подход, используемый, чтобы позволить администраторам в системе Ubuntu выполнять произвольные команды как корень с sudo; такие пользователи являются членами sudo группа, который /etc/sudoers имеет запись для. Можно создать другие группы и дать им другие полномочия, которые могут быть более строгими, чем способность sudo группа должна выполнить произвольные команды.

В-четвертых, даже если Вы действительно хотите следовать за подходом, который Вы проявляете, существуют лучшие пути, чем наличие одного сценария встраивает фрагмент, который это использует для отбора других сценариев, которые Вы вручную изменяете. Два подхода я подозреваю Вас, могли бы найти самым полезным:

  • Можно поместить lastuser="$(grep home /etc/passwd | cut -d: -f 1 | tail -1)" в файле, который не должен быть исполняемым файлом, ни запуститься с a #! строка hashbang и затем источник, который файл в любых сценариях собирается использовать lastuser, при наличии тех сценариев содержат команду . lastuser.sh (или source lastuser.sh, который эквивалентен в ударе), где lastuser.sh название файла, который содержит команду. lastuser переменная определяется в то время . lastuser.sh управляйте выполнениями, таким образом, это будет все еще всегда зависеть от текущего состояния /etc/passwd.
  • Если Вы действительно хотите, чтобы один сценарий создал другого, то вместо того, чтобы встраивать код, который будет скопирован в первый сценарий, можно сделать основной файл, который содержит его, имеют первый сценарий, просто копируют тот файл в желаемое местоположение. Вы могли сделать копирование с cp или install.
0
ответ дан 7 December 2019 в 19:34

Используйте здесь документ, удостоверяясь заключать слово разделителя в кавычки так, чтобы оболочка ничего не разворачивала в теле:

#!/bin/bash    

cat << 'EOF' | sudo tee -a /usr/local/sbin/adduser.local
#!/bin/bash
lastuser="$(grep home /etc/passwd | cut -d: -f 1 | tail -1)"
EOF

Использование tee то, потому что sudo echo "..." >> somefile не делает то, что Вы думаете, что это делает - видят, Как решить “разрешение, отклоненное” при использовании sudo с перенаправлением в Bash?

0
ответ дан 7 December 2019 в 19:34

Другие вопросы по тегам:

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