Вам не нужно включать или устанавливать пароли, и вам действительно не нужно, если вы уже используете надежные ключи. Просто повторно заблокируйте свою учетную запись (sudo passwd -l username) из существующего сеанса и исправьте конфигурацию SSH.
Причина, по которой это произошло, вероятно, связана с тем, что вы изменили одну из настроек демона SSH по умолчанию (в / etc / ssh / sshd_config).
Измените это в / etc / ssh / sshd_config и перезапустите SSH:
UsePAM yes
В общем, если у вас нет действительно веских причин для отключения PAM, я рекомендую оставить его включенным; включение PAM в SSH позволит вам по-прежнему входить в систему, даже если пароль удален. Что бы вы ни делали, не устанавливайте пустой пароль или что-то подобное ... блокировка поля пароля не обязательно означает блокировку всей вашей учетной записи.
Совет при использовании SSH: держите другой сеанс открытым (в другом окне) всякий раз, когда вносите изменения в конфигурацию SSH, а затем проверьте, можете ли вы войти в систему; если вы случайно нарушите свой доступ, воспользуйтесь текущим сеансом, чтобы исправить это.
(Отказ от ответственности: я работаю в Userify , который предоставляет программное обеспечение для управления ключами SSH.)
for file in *; do
[ -f "$file" ] || continue
IFS= read -r line < "$file" || [ -n "$line" ] || continue
case $line in
("#include"*) printf '%s\n' "$file"
esac
done
Чтобы напечатать содержимое файла вместо его имени, замените команду printf
на cat < "$file"
.
Если ваш awk
поддерживает расширение nextfile
и вас не волнуют возможные побочные эффекты открытия не -обычных файлов:
awk '/^#include/{print substr(FILENAME, 3)}; {nextfile}'./*
С помощью zsh
вы можете заменить ./*
на ./*(-.)
, чтобы передавать только обычные файлы (или символические ссылки на обычные файлы, как для подхода [ -f... ]
выше )к awk
.
Или распечатать содержимое файла вместо имени:
awk 'FNR == 1 {found = /^#include/}; found'./*
(этот портативный ).
Легко проверить, начинается ли первая строка с #include
в (GNU и AT&T )sed:
sed -n '1{/^#include/p};q' file
Или упрощенный (и совместимый с POSIX):
sed -n '/^#include/p;q' file
Это будет иметь результат, только если файл содержит #include
в первой строке. Это нужно только прочитать первую строку, чтобы сделать проверку, так что это будет очень быстро.
Итак, цикл оболочки для всех файлов (с sed )должен быть таким:
for file in *
do
[ "$(sed -n '/^#include/p;q' "$file")" ] && printf '%s\n' "$file"
done
Если в pwd есть только файлы (, а не каталоги ).
Если вам нужно напечатать все строки файла, подойдет решение, аналогичное первому опубликованному коду. (Версия GNU & AT&T):
sed -n '1{/^#include/!q};p' file
Или, (BSD-совместимая версия POSIXfied):
sed -ne '1{/^#include/!q;}' -e p file
Или:
sed -n '1{
/^#include/!q
}
p
' file
for file in *
do
[ -f "$file" ] && head -n 1 < "$file" | grep -q '^#include' && cat < "$file"
done
Учтите, что при включенной опции -q
grep
завершится с нулевым статусом даже в случае возникновения ошибки.
Этот вопрос является прекрасным примером, когда решения bash и sed довольно сложны, но задача может быть намного проще с помощью (GNU )awk:
gawk 'FNR==1 && /^#include/{print FILENAME}{nextfile}' *