Смена пароля Debian отменена

cat /tmp/DISKREQ.TMP | awk '{print$6}' | awk 'length($0) == 22' > /tmp/DISKREQ.TMP

Компоненты конвейера выполняются параллельно. Таким образом, эта строка выполняет три команды параллельно:

  • cat /tmp/DISKREQ.TMP
  • awk '{print$6}'
  • awk 'length($0) == 22' > /tmp/DISKREQ.TMP

Первая команда открывает /tmp/DISKREQ.TMP для чтения. Третья команда усекает /tmp/DISKREQ.TMP, прежде чем сделать что-либо еще. В зависимости от времени, cat может успеть или не успеть прочитать хотя бы начало файла.

Решение: не пишите в тот же файл, что и входные данные. (Есть более сложные и более хрупкие решения, позволяющие повторно использовать имя; я не буду приводить их, потому что нет смысла делать здесь что-то сложное.)

df -gt | grep /home/prods/db2/ > /tmp/DISKREQ.TMP
if [[ $? -eq 0 ]]; then
    cat /tmp/DISKREQ.TMP | awk '{print$6}' | awk 'length($0) == 22' > /tmp/DISKREQ2.TMP
    cat /tmp/DISKREQ2.TMP | while read line
    …

(Не используйте chmod 777. Это никогда ничего не решает, но может создать проблемы.)

Однако вам не нужны все эти временные файлы, поэтому вы можете полностью обойти проблему, избавившись от них. Просто направьте цепочку awk прямо в цикл while, чтобы избавиться от второго временного файла. Я также избавился от бесполезного использования cat и объединил два awk скрипта в один.

df -gt | grep /home/prods/db2/ > /tmp/DISKREQ.TMP
if [[ $? -eq 0 ]]; then
    </tmp/DISKREQ.TMP awk 'length($6) == 22 {print $6}' | while read line
    do
    …

Вы можете даже избавиться от awk вообще и выполнять фильтрацию в цикле while read; я оставлю это упражнение читателю.

Чтобы избавиться от первого временного файла, нужно немного изменить логику. Тело цикла while все равно не будет выполняться, если grep ничего не найдет, поскольку он получит ноль строк для работы, но вам нужна логика для вывода сообщения в этом случае. В awk можно использовать директиву END.

df -gt | grep /home/prods/db2/ |
awk 'length($6) == 22 {print $6}
     END {if (NR==0) print "No Instance Home directory Mounted"}' |
while read line; do …

Вы можете объединить вызов grep с awk. (Упражнение для читателя.) Или вы можете выполнить всю фильтрацию в оболочке. Я предполагаю, что /home/prods/db2/ всегда будет началом шестого столбца.

found=0
df -gt |
while read device total used available percent mountpoint; do
    [[ $mountpoint == /home/prods/db2/* ]] || continue
    ((++found))
    [[ ${#mountpoint} -eq 22 ]] || continue
    …
done
if ((found == 0)); then echo "No Instance Home directory Mounted"; fi
0
25.02.2018, 18:31
1 ответ

Está restableciendo la contraseña de root cuando usa sudo passwd. El comando literalmente significa 'ejecutar passwd como root'.

Para cambiar la contraseña del usuario, simplemente use passwd. Este comando está destinado a ser utilizado por usuarios estándar. Esto funciona porque al archivo de comando se le asigna el bit 'suid'.

3
28.01.2020, 02:24

Теги

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