При входе в систему или выходе оболочка зависает для определенного пользователя, пока он не нажмет Ctrl + C

в сценарии интерпретируется как начало здесь-документа.

Обычно здесь-документ записывается как, например,

cat <

... но вполне нормально использовать $ Output или любую другую строку в качестве разделителя здесь-документа.

Вы, вероятно, хотели использовать , но это тоже было бы неправильно, так как это было бы воспринято как попытка чтения из файла $ Output , который является не имя файла, а результат вашего конвейера.

Попробуйте вместо этого передать вывод в цикл while, как вы это делали в командной строке:

#!/bin/bash

snmpwalk -m /usr/share/snmp/mibs/CISCO-UNIFIED-COMPUTING-STORAGE-MIB.my \
  -v2c -c opennms-Priv X.X.X.X .1.3.6.1.4.1.9.9.719.1.45.4.1.18 2>/dev/null |
awk '{print $4}' |
while read -r line; do 
  echo "Drive $line"
done

Я предпочитаю использовать printf , а не echo , когда требуется вывод чтобы содержать данные, предоставленные пользователем (на самом деле любые данные, поступающие извне сценария):

printf 'Drive %s\n' "$line"

См. « Почему printf лучше, чем echo? »

Обновлено:

Если ваш вывод должен выглядит как

Drive1 online(1)
Drive2 online(1)
... etc.

, где число после Drive строго увеличивается на единицу для каждой строки, тогда вам понадобится счетчик в цикле:

while read -r line; do 
  printf 'Drive%d %s\n' "$(( ++count ))" "$line"
done

1
07.07.2017, 07:54
1 ответ

Во-первых, я бы проверил все места, откуда tcsh выполняет команды при запуске.

На справочной странице сказано следующее (Я выделил жирным шрифтом расположение файлов):

A login shell begins by executing commands from the system files /etc/csh.cshrc and /etc/csh.login. It then executes commands from files in the user's home directory: first ~/.tcshrc (+) or, if ~/.tcshrc is not found, ~/.cshrc, then ~/.history (or the value of the histfile shell variable), then ~/.login, and finally ~/.cshdirs (or the value of the dirsfile shell variable) (+). The shell may read /etc/csh.login before instead of after /etc/csh.cshrc, and ~/.login before instead of after ~/.tcshrc or ~/.cshrc and ~/.history, if so compiled; see the version shell variable. (+)

Если это вас ни к чему не приведет, я бы попробовал следующие две вещи:

  • Войдите в систему как пользователь-нарушитель и дайте ему зависнуть, переключитесь на другую консоль и установите флажок w-, который должен показать вам, что работает этот пользователь.
  • Ctrl+Zвместо Ctrl+C-, что должно приостанавливать запущенный процесс, а не прерывать его. Затем jobs, чтобы увидеть, что было приостановлено.

РЕДАКТИРОВАТЬ :Как указал JdeBP в комментариях, вы также можете установить параметры -xи -Vна tcsh в su -, хотя я думаю, что вы могли бы найти оскорбительную вещь с помощью -X. Примерно так:

su - troublesome_user -- -X
  • -x повторяет все команды перед выполнением
  • -v ввод команды повторяется после подстановки истории
  • -X То же, что и -x, но применяется даже до обработки.tcshrc
  • -V То же, что и -v, но применяется даже до обработки.tcshrc
2
27.01.2020, 23:33

Теги

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