Попытка отфильтровать пользователей из / etc / passwords, а затем добавить их в текст, который затем go в выходной файл - PullRequest
0 голосов
/ 06 августа 2020

Скрипт в его нынешнем виде (не работает):

#!/bin/bash
while read line
uname="cat /etc/passwd | grep bash | sed 's/:.*//'"
echo "config system admin 
for each line $uname >
if $uname = "root" then
echo "skipping $uname 'root'" else
echo "edit '$uname'/n
set remote-auth enable/n
set trusthost1 8.8.8.8 255.255.255.255/n
set accprofile "admin"/n
set vdom "root"/n
set remote-group "foobar"/n
set password ENC potatoes/n
next/n" > output.txt

Вывод из "cat / etc / passwd | grep bash | sed 's /:.*//'"

foo
root
bar

Ожидаемый результат в "output.txt" с тремя пользователями, перечисленными в "/ etc / password": foo, root и bar:

config system admin 
edit foo 
set remote-auth enable
set trusthost1 8.8.8.8 255.255.255.255
set accprofile "admin"
set vdom "root"
set remote-group "foobar"
set password ENC potatoes
next
edit bar
set remote-auth enable
set trusthost1 8.8.8.8 255.255.255.255
set accprofile "admin"
set vdom "root"
set remote-group "foobar"
set password ENC potatoes
next

1 Ответ

0 голосов
/ 06 августа 2020

Ваш синтаксис испорчен. Я предполагаю, что вы хотите

#!/bin/bash

echo "config system admin" >output.txt

sed -n '/bash/s/:.*//p' /etc/passwd |
while read -r uname; do
  if [ "$uname" = "root" ]; then
    echo "skipping '$uname'" >&2
  else
    cat <<____
edit $uname
set remote-auth enable
set trusthost1 8.8.8.8 255.255.255.255
set accprofile "admin"
set vdom "root"
set remote-group "foobar"
set password ENC potatoes
next
____
  fi
done >>output.txt

Вероятно, вы пытались ввести \n (не /n), чтобы указать буквальный перевод строки, но строка уже содержит все необходимые новые строки.

Я провел рефакторинг, чтобы избежать бесполезного cat и бесполезного grep, но основные исправления c syntacti c, вероятно, более важны, если вы только изучают основы.

Использование cat с здесь-документом вместо echo, вероятно, не является решающим изменением здесь, но упрощает загадку вложенного цитирования, в которую вы попадаете.

Если (как указано в комментарии) вы хотите пропустить многих пользователей, а не только root, возможно, переключитесь на оператор case:

while read -r uname; do
  case $uname in
    "root" | "fred" | "barney" | "dino")
      echo "skipping '$uname'" >&2;;
  *)
    cat <<____;;
...
____
  esac
done 

Этот синтаксис сначала выглядит сбивающим с толку, но он не опасно, просто отличается от того, как выглядит большинство других языков. Случай * похож на else в предыдущем скрипте, и каждая ветвь должна заканчиваться двойной точкой с запятой.

...