LINUX.ORG.RU

проблема со сценарием на bash

 , ,


0

1

Добрый день! Я изучаю Unix самостоятельно по книге и сейчас у меня возникла проблема с одним из заданий: «Напишите сценарий, анализирующий с помощью case список пользователей, находящихся в настоящий момент в системе. Если имеется хотя бы один сеанс root, должно выдаваться предупреждающее сообщение.»

Командой who | awk {'print $1'} я получаю строку из пользователей находящихся в данный момент в системе.

Или же командой ps -all | awk {'print $3'} я получу строку из UID.

Вопрос в следующем, мне надо читать это строку по очереди? Т.е. взять первое слово из строки и проверить входит ли оно в «root», потом второе и так далее. Цикл for еще не проходился, поэтому я его типа не знаю.


Ответ на: комментарий от alozovskoy

нет, еще не прошли. книга Береснев. Администрирование GNU, Linux Глава 10. Этот раздел посвящен case.

patr88
() автор топика
$ who | awk '/^root\s/ {print "alarm"}'
anonymous
()

А grep?

$ ps -all | awk {'print $3'} | grep '^0$'
Здесь с регулярными выражениями.
Тогда case не нужен, просто проверить пустой ли вывод.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)
Ответ на: комментарий от Kroz

нужно то именно с case , загвоздка именно в этом)

patr88
() автор топика

who | awk {'print $1'}
ps -all | awk {'print $3'}

Выдают немного разные вещи.
who - список залогиненных пользователей
ps -all - как я понял - список процессов, запущенных залогиненными пользователями.
Разница в том, что я могу быть залогиненным как kroz, а запустить процесс от root с помощью sudo.

Так что, строго говоря, для поставленной задачи более правильно использовать who.

Kroz ★★★★★
()
#!/bin/bash

function f1() {
  echo 'qwe
root
asd'
}

function f2() {
  echo 'qwe
qwerootasd
asd'
}

function f3() {
  echo 'root'
}
     
shopt -s extglob
case $(f1) in
  @(|*[[:space:]])root@(|[[:space:]]*) )
     echo "1.catch"
  ;;
esac

case $(f2) in
  @(|*[[:space:]])root@(|[[:space:]]*) )
     echo "2.catch"
  ;;
esac

case $(f3) in
  @(|*[[:space:]])root@(|[[:space:]]*) )
     echo "3.catch"
  ;;
esac
anonymous
()
Ответ на: комментарий от Kroz

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

patr88
() автор топика
Ответ на: комментарий от anonymous

Анонимус спасибо, я переделал немного. Предупреждение выдает. Что значит shopt -s extglob?

 
#!/bin/bash

f1=$(who | awk {'print $1'}) 
shopt -s extglob 
case $f1 in 
    @(|*[[:space:]])root@(|[[:space:]]*) ) 
    echo «1.catch» ;; 
esac

patr88
() автор топика
Ответ на: комментарий от patr88

http://mywiki.wooledge.org/glob

In addition to the traditional globs (supported by all Bourne-family shells) that we've seen so far, Bash (and Korn Shell) offers extended globs, which have the expressive power of regular expressions.

anonymous
()
Ответ на: комментарий от anonymous

ну я имел ввиду,что скрипт работает) - предупреждение выдает)

patr88
() автор топика
Ответ на: комментарий от ziemin
CT=$(awk -F: '/$QW/{print $6}' /test.txt)[/bash]

Есть переменная QW. Вопрос как мне её заэкранировать?

CT=$(awk -F: '/ZENIT/{print $6}' /test.txt)[/bash]
когда так задаю, все работает, а как только пытаюсь вставить переменную, выдается 6 столбец из файла.
patr88
() автор топика
Ответ на: комментарий от patr88

Я не знаю, что за двоеточия и что за F, но могу сказать одно - одинарные кавычки экранируют всё. Двойные только очеввидные весчи. Впрочем как и скобки.

ziemin ★★
()
Ответ на: комментарий от patr88
  • #!/bin/bash - выбор интерпретатора
  • var - переменная в bash скрипте
  • = - запись в переменную значения
  • "(^2)|(4$)" - собственно значение, в будущем контексте - паттерн для регулярного выражения, отбирающего только строки начинающиеся (^) с 2 или заканчивающиеся ($) на 4
  • seq 20 - возвращает список цифр от 1 до 20
  • | - перенаправление потоков от одного процесса к другому
  • awk - интерпретируемый скриптовый C-подобный язык построчного разбора и обработки входного потока по заданным шаблонам (wikipedia)
  • -v - опция, за которой идет конструкция переменная=значение, представляет собой присваивание, которое должно быть сделано перед выполнением программы (opennet)
  • p="$var" - записываем в переменную awk скрипта значение переменной var bash скрипта
  • ' - начало строки в bash которая будет скриптом awk
  • $0 - полное значение входящей строки в awk скрипте
  • ~ - выражение отношения «содержится», регулярное выражение должно быть справа от ~ (opennet)
  • p - переменная awk скрипта, в которой находится значение переменной var bash скрипта, в которой находится паттерн регулярного выражения (смотри пункт 4)
  • ' - конец строки в bash
anonymous
()
Ответ на: комментарий от anonymous

спасибо за проделанную работу, но твой пример только больше меня запутывает (есть несколько ненужных для примера операций). у меня была конкретная проблема. с конкретными переменными. код тут не 50+ строк. В моем конкретном случае было достаточно перенести одинарную кавычку.

patr88
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.