Оболочка: возможно ли задержать команду без использования `Sleep`?

Как я могу зарегистрировать пароль, введенный для команды 'sftp'?

В основном вы не можете этого сделать, пока не измените исходный код openssh . И ты не хочешь этого делать.

sftp использует безопасную оболочку (SSH), которая считывает пароль, отправляет его на сервер и безопасно обнуляет память, в которой он был сохранен. Это означает, что вы не сможете получить пароль, что является хорошей практикой безопасности.

Есть ли у вас для этого причина? Вы хотите за кем-то шпионить?

22
19.11.2018, 13:36
9 ответов

У вас есть альтернативыsleep:Это atи cron. В отличие от sleepони требуют, чтобы вы указали время, в которое вам нужно, чтобы они запускались.

  • Убедитесь, что служба atdзапущена, выполнив service atd status.
    Теперь предположим, что дата 11 :17 утра по всемирному координированному времени; если вам нужно выполнить команду в 11 :25 UTC, используйте синтаксис :echo "This is a test" | at 11:25.
    Теперь имейте в виду, что atdпо умолчанию не будет регистрировать завершение заданий. Для получения дополнительной информации см. эту ссылку . Лучше, чтобы ваше приложение имело собственное ведение журнала.

  • Вы можете запланировать задания в cron, для получения дополнительной информации см. :man cron, чтобы просмотреть его параметры, или crontab -e, чтобы добавить новые задания. /var/log/cronможно проверить информацию о выполнении заданий.

К вашему сведению sleep system callприостанавливает текущее выполнение и назначает его по расписанию. аргумент перешел к нему.

РЕДАКТИРОВАТЬ:

Как упомянул @Gaius,вы также можете добавить время в минутах к команде at. Но скажем, время 12:30:30, и теперь вы запустили планировщик с now +1 minutes. Несмотря на то, что была указана 1 минута, что соответствует 60 секундам, atна самом деле не ждет до 12:31:30для выполнения задания, а выполняет задание в 12:31:00. Единицы времени -могут быть minutes, hours, days, or weeks. Подробнее см.man at

например:echo "ls" | at now +1 minutes

19
27.01.2020, 19:42

Нет встроенного -, который делает то же самое, что и sleep(, если только sleepне встроен -в ). Однако есть некоторые другие команды, которые будут ждать.

Некоторые включают.

  • atиcron:используются для планирования задач в определенное время.

  • inotifywait:используется для ожидания файла или файлов, которые будут изменены/удалены/добавлены/и т. д.

3
27.01.2020, 19:42

самый старый трюк в книге:

read && echo "This is a test"

Просто нажмите Enter и все продолжится!

4
27.01.2020, 19:42

С bashвстроенными функциями вы можете:

coproc read -t 10 && wait "$!" || true

Чтобы заснуть на 10 секунд без использования sleep. coprocдолжен сделать так, чтобы stdin readбыл каналом, из которого никогда ничего не выйдет. || trueсвязано с тем, что статус выхода waitбудет отражать доставку SIGALRM, что приведет к завершению работы оболочки, если установлена ​​опция errexit.

В других оболочках:

mkshи ksh93имеют встроенный sleep-, нет смысла использовать что-то еще там (, хотя они оба также поддерживаютread -t).

zshтакже поддерживает read -t, но также имеет встроенную оболочку вокруг select(), так что вы также можете использовать:

zmodload zsh/zselect
zselect -t 1000 # centiseconds

Если вы хотите запланировать запуск вещей из сеанса интерактивной оболочки, см. также модульzsh/schedвzsh.

32
27.01.2020, 19:42

Использование bash, встроенного -в переменную $SECONDSи занятого цикла -:

for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
6
27.01.2020, 19:42

Поскольку есть ответы, предлагающие использовать нестандартную --t delayопцию read, вот способ выполнить -считывание по времени в стандартной оболочке:

{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }

Аргумент к stty timeв десятых долях секунды.

7
27.01.2020, 19:42

Классика из Страны Windows и Пакетов:

ping -c 11 localhost >/dev/null && echo "This is a test"
3
27.01.2020, 19:42

Некоторые другие идеи.

top -d10 -n2 >/dev/null

vmstat 10 2 >/dev/null

sar 10 1 >/dev/null

timeout 10s tail -f /dev/null
9
27.01.2020, 19:42

Если вы хотите интерактивно ожидать новой строки в файле, тогда

tail -f
.

Ожидаете изменения в файловой системе? Затем используйте, например.

inotify / inoticoming
.

Есть и другие варианты, в зависимости от того, что вы подразумеваете под «подождать».

0
27.01.2020, 19:42

Теги

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