Мое предложение за два цента: Вы могли использовать PAM, чтобы сделать это.
Например, Использование некоторый pam модуль как pam-mysql для хранения некоторых пользователей в mysql и pam_require, чтобы избежать, чтобы mysql-сохраненные пользователи могли получить доступ кроме sftp сервиса.
Начните смотреть здесь: модули/Приложения, доступные или происходящие...
Использовать sh -c 'commands'
как команда, например:
/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'
Попробуйте это:
% (time ( { echas z; echo 2 } 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput
( { echas z; echo 2; } 2>&3; ) 0.00s user 0.00s system 0% cpu 0.004 total
Во-первых, мы должны найти способ перенаправить вывод time
. С тех пор time
встроенная оболочка, она берет полную командную строку в качестве команды, которая будет измеряться, включая перенаправления. Таким образом,
% time whatever 2>timeoutput
whatever 2> timeoutput 0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput
zsh: command not found: whatever
[Примечание: комментарий janos подразумевает дело обстоит не так для bash
.] Мы можем достигнуть перенаправления time
произведенный путем выполнения time
в подоболочке и затем перенаправлении вывода той подоболочки.
% (time whatever) 2> timeoutput
% cat timeoutput
zsh: command not found: whatever
whatever 0.00s user 0.00s system 0% cpu 0.018 total
Теперь мы успешно перенаправили вывод time
, но его вывод смешан с выводом ошибок команды, которую мы измеряем. Для разделения этих двух мы используем дополнительный дескриптор файла.
На "внешней стороне" мы имеем
% (time ... ) 3>&2 2>timeout
Это означает: то, независимо от того, что записано в дескриптор файла 3, будет произведено к тому же дескриптору файла места 2 (стандартная погрешность), производит теперь (терминал). И затем мы перенаправляем стандартную погрешность в файл timeout
.
Таким образом, теперь мы имеем: все записанное в stdout и fd 3 перейдет к терминалу, и все записанное в stderr перейдет к файлу. То, что оставляют, должно перенаправить stderr измеренной команды к fd 3.
% (time whatever 2>&3) 3>&2 2>timeout
Теперь, чтобы заставить время измерить больше чем одну команду, мы должны выполнить их в (другой!) подоболочка (в круглых скобках). И перенаправить вывод ошибок всех их к fd 3, мы должны сгруппировать их в фигурных скобках.
Так, наконец, мы прибываем в:
% (time ( { whatever; ls } 2>&3 ) ) 3>&2 2>timeoutput
Именно.
Неправильный ответ, но очень связанный с вопросом.
Получить статистику времени для нескольких программ, объединенных круглыми скобками. Разделяйте команды точкой с запятой ; или && , если команда 2 должна выполняться только тогда, когда команда 1 завершилась без ошибки:
time ( command1 ; command2 )
time ( command1 && command2 )