Как я могу распечатать только определенные команды из сценария удара, когда они выполняются?

Завихрение может считать пароли из ~/.netrc. Добавьте строку как это к ~/.netrc:

machine bitbucket.org login schmijos password swordfish

и выполненный

curl --netrc --digest --user schmijos https://bitbucket.org/u/p/get/tip.zip -o tip

19
23.05.2017, 14:33
6 ответов

Когда я пишу более сложные сценарии удара, я использую немного функции для команд выполнения, которые также распечатают команды, сталкивается с файлом журнала:

runthis(){
    ## print the command to the logfile
    echo "$@" >> $LOG
    ## run the command and redirect it's error output
    ## to the logfile
    eval "$@" 2>> $LOG 
}

Затем в моем сценарии я выполняю команды как это:

runthis "cp /foo/bar /baz/"

Если Вы не хотите распечатанную команду, просто выполняете ее обычно.

Можно или установить $LOG к имени файла или просто удаляют его и печать к stdout или stderr.

12
27.01.2020, 19:45
  • 1
    +1 Также я смог выполнить эту внутреннюю часть мой сценарий путем простого предварительного ожидания "важных" команд с коротко названной версией функции, таким образом, взгляд строк что-то как v python ascript.py не имея необходимость включать в цитаты и терять мой код энергии, выделяющий –  Trindaz 27.12.2013, 16:19
  • 2
    @Trindaz, кавычки там для того, когда необходимо передать переменные в командах, если переменные содержат пробелы, у Вас могли бы быть проблемы иначе. –  terdon♦ 27.12.2013, 16:23
  • 3
    eval ..... || ok=1 : установит хорошо на "1" только, когда "оценка..." перестанет работать?? Возможно, Вы имели в виду "&&"? И если Вы подразумевали, что, добавьте "ok=0" перед строкой оценки, таким образом, она "сбрасывается" каждый раз. Или просто переименуйте "хорошо" в "ошибку"? кажется, что это - то, что было предназначено здесь. Таким образом в конце: eval "$@" 2>> "$LOG" && error=0 || error=1 –  Olivier Dulac 27.12.2013, 16:50
  • 4
    @OlivierDulac, в версии этого, которое я использую, я имею ok переменная, которая остановит сценарий, если какая-либо команда перестанет работать. Так как это не было релевантно здесь, я удалил его, но забыл удалять || ok=1. Спасибо, зафиксированное теперь. –  terdon♦ 27.12.2013, 16:53

Я видел методы, используемые подобный @terdon. Это - начало того, что высокоуровневые языки программирования называют регистраторами и предложением как полноценные библиотеки, такие как log4J (Java), log4Perl (Perl) и т.д.

Можно получить что-то подобное использование set -x в Bash, как Вы упомянули, но можно использовать его для поднимания отладки просто подмножество команд путем обертывания блоков кода с ними как так.

$ set -x; cmd1; cmd2; set +x

Примеры

Вот один шаблон лайнера, который можно использовать.

$ set -x; echo  "hi" ;set +x
+ echo hi
hi
+ set +x

Можно перенести их как это для нескольких команд в сценарии.

set -x
cmd1
cmd2
set +x

cmd3

Log4Bash

Большинство людей является забывающим, но Bash также имеет log4* также, Log4Bash. Если у Вас есть более скромные потребности, это могло бы стоить времени для установки его.

log4bash является попыткой иметь лучше вход для сценариев Bash (т.е. заставить входящий в систему Bash высосать меньше).

Примеры

Вот некоторые примеры использования log4bash.

#!/usr/bin/env bash
source log4bash.sh

log "This is regular log message... log and log_info do the same thing";

log_warning "Luke ... you turned off your targeting computer";
log_info "I have you now!";
log_success "You're all clear kid, now let's blow this thing and go home.";
log_error "One thing's for sure, we're all gonna be a lot thinner.";

# If you have figlet installed -- you'll see some big letters on the screen!
log_captains "What was in the captain's toilet?";

# If you have the "say" command (e.g. on a Mac)
log_speak "Resistance is futile";

Log4sh

Если Вы захотите то, что я классифицировал бы как большее количество полной мощности log4* платформа затем, то я дам Log4sh попытку.

выборка

log4sh был первоначально разработан для решения регистрирующейся проблемы, которую я имел в некоторых продуктивных средах, я работал в том, где у меня или было слишком много входа, или недостаточно. Задания крона в особенности вызвали меня большинство головных болей с их постоянными и раздражающими электронными письмами, говоря мне, что все работало, или что ничто не работало, но не подробная причина почему. Я теперь использую log4sh в средах, где вход из сценариев оболочки очень важен, но где я нуждаюсь в больше, чем просто простое "Привет, фиксирую меня!" тип регистрирующегося сообщения. Если Вам нравится то, что Вы видите или имеете любые предложения на улучшениях, не стесняйтесь отбрасывать меня электронное письмо. Если будет достаточно интереса к проекту, то я разработаю его далее.

log4sh был разработан под Границей Снова Shell (/bin/bash) на Linux, но большую заботу соблюдали, чтобы удостовериться, что это работает под Оболочкой Bourne по умолчанию Соляриса (/bin/sh), поскольку это, оказывается, основная производственная платформа, используемая один.

Log4sh поддерживает несколько оболочек, не просто Bash.

  • Оболочка Bourne (sh)
  • Bash - граница GNU снова окружает (колотят)
  • ТИРЕ (тире)
  • Korn Shell (ksh)
  • pdksh - Общественное достояние Korn Shell (pdksh)

Это было также протестировано на нескольких Ose, не просто Linux.

  • Cygwin (в соответствии с Windows)
  • (Поддерживаемый пользователем) FreeBSD
  • Linux (хинду, Redhat, Ubuntu)
  • Mac OS X
  • Солярис 8, 9, 10

Используя log4* платформа займет время для выучения лишь его, стоит того, если у Вас есть более требовательные потребности от Вашего входа. Log4sh использует конфигурационный файл, где можно определить appenders и управлять форматированием для вывода, который появится.

Пример

#! /bin/sh
#
# log4sh example: Hello, world
#

# load log4sh (disabling properties file warning) and clear the default
# configuration
LOG4SH_CONFIGURATION='none' . ./log4sh
log4sh_resetConfiguration

# set the global logging level to INFO
logger_setLevel INFO

# add and configure a FileAppender that outputs to STDERR, and activate the
# configuration
logger_addAppender stderr
appender_setType stderr FileAppender
appender_file_setFile stderr STDERR
appender_activateOptions stderr

# say Hello to the world
logger_info 'Hello, world'

Теперь, когда я выполняю его:

$ ./log4sh.bash 
INFO - Hello, world

Примечание: Вышеупомянутое настраивает appender как часть кода. Если Вам нравится, это может быть извлечено в его собственный файл, log4sh.properties и т.д.

Консультируйтесь с превосходной документацией для Log4sh при необходимости в более подробной информации.

2
27.01.2020, 19:45
  • 1
    Спасибо за добавленные примечания, но основную проблему я имею с этим, весь set команды, которые я должен был бы представить, чередующийся вокруг комментариев и т.д., поэтому просто имея функцию наверху моего сценария, с односимвольным вызовом функции, предварительно ожидаемым ко всем "важным" строкам в сценарии, казались более опрятными мне на данный момент. (отдельный символ, потому что функция имеет односимвольное имя) –  Trindaz 27.12.2013, 17:06
  • 2
    @Trindaz - извините я еще не закончил свой ответ. Смотрите на log4bash, если у Вас есть больше потребностей, что функция, которую дал terdon. –  slm♦ 27.12.2013, 17:07
  • 3
    @Trindaz - Я время от времени делаю что-то подобное, другой подход, который я использовал, должен перенестись echo в моей собственной функции, mecho, и затем передайте переключатель в названную программу -v для подробного, когда я хочу включить вещи прочь. Я также могу управлять им с 2-м переключателем аргумента, который указывает имя функции, таким образом, у меня есть 2 оси, на которых можно управлять входом. Это часто - шлюз к желанию log4bash все же. –  slm♦ 27.12.2013, 17:09
  • 4
    @Trindaz set -x печать управляет, поскольку они выполняются. Это не печатает комментарии. set -x практично для отладки (в отличие от этого, set -v который не очень полезен). Zsh лучше произвел для set -x чем удар например, это показывает, какая функция в настоящее время выполняется и исходный номер строки. –  Gilles 'SO- stop being evil' 27.12.2013, 17:39
  • 5
    Спасибо @Gilles это правда, но это действительно давало мне, если расширения выражения, который был излишеством в этом случае –  Trindaz 27.12.2013, 17:40

Используйте подколочку, т. Е.

( set -x; cmd1; cmd2 )

Например:

( set -x; echo "hi there" )

Отпечатки

+ echo 'hi there'
hi there
11
27.01.2020, 19:45

Вы можете использовать функцию оболочки sh_trace из библиотеки stdlib POSIX , чтобы распечатать команду в цвете перед запустил это. Пример:

preview

Базовая функция Awk:

function sh_trace(ary,   b, d, k, q, w, z) {
  b = "\47"
  for (d in ary) {
    k = split(ary[d], q, b)
    q[1]
    if (d - 1)
      z = z " "
    for (w in q) {
      z = z (!k || q[w] ~ "[^[:alnum:]%+,./:=@_-]" ? b q[w] b : q[w]) \
      (w < k ? "\\" b : "")
    }
  }
  printf "\33[36m%s\33[m\n", z
  system(z)
}
0
27.01.2020, 19:45

Это переработанная версия аккуратной функции Стивена Пенни. Она печатает свои аргументы в цвете и заключает их в кавычки по мере необходимости. Используйте ее для выборочного вывода эхом команд, которые вы хотите отследить. Поскольку кавычки выводятся, вы можете копировать напечатанные строки и вставлять их в терминал для немедленного повторного выполнения во время отладки сценария. Прочитайте первый комментарий, чтобы узнать, что я изменил и почему.

xc() # $@-args
{
  cecho "$@"
  "$@"
}
cecho() # $@-args
{
  awk '
  BEGIN {
    x = "\047"
    printf "\033[36m"
    while (++i < ARGC) {
      if (! (y = split(ARGV[i], z, x))) {
        printf (x x)
      } else {
        for (j = 1; j <= y; j++) {
          printf "%s", z[j] ~ /[^[:alnum:]%+,./:=@_-]/ ? (x z[j] x) : z[j]
          if (j < y) printf "\\" x
        }
      }
      printf i == ARGC - 1 ? "\033[m\n" : FS
    }
  }
  ' "$@"
}

Пример использования с выводом:

# xc echo "a b" "c'd" "'" '"' '"' "fg" '' " " " " \# эта строка печатается зеленым цветом

echo 'a b' c\'d \' '"' fg '' ' ' ''' '#' эта строка печатается зеленым

a b c'd ' " fg # эта строка печатается зеленым

Вторая строка выше печатается зеленым и может быть скопирована для воспроизведения третьей строки.

Дальнейшие замечания

Оригинальный xc Стивена Пенни очень умен, и он заслуживает всех похвал за него. Однако я заметил некоторые проблемы, но я не мог прокомментировать его сообщение напрямую, потому что у меня недостаточно репутации. Поэтому я внес предложенную правку в его сообщение, но рецензенты отклонили мою правку. Поэтому я прибегнул к публикации своих комментариев в виде этого ответа, хотя я бы предпочел иметь возможность редактировать ответ самого Стива Пенни.

Что я изменил в ответе Стивена Пенни

Исправлено: печать нулевых строк - они не печатались. Исправлено: печать строк, включающих % - они вызывали синтаксические ошибки awk. Заменен for (j in ...) на for (j = 0, ...), поскольку первый не гарантирует порядок обхода массива (это зависит от реализации awk). Добавлен 0 к восьмеричным числам для переносимости.

Обновление

Стивен Пенни исправил эти проблемы в своем ответе, так что эти замечания остались только для исторической справки о моем ответе. Более подробную информацию см. в разделе "Комментарии".

0
27.01.2020, 19:45

Вы можете поставить ловушку DEBUG и затем проверить переменную BASH_COMMAND. Добавьте это в начало сценария:

log() {
    case "$1" in
        python\ *)
            ;&
        pkill\ *)
            printf "%s\n" "$*"
            ;;
    esac
}

trap 'log "$BASH_COMMAND"' DEBUG

Код читабелен; он просто проверяет, начинается ли первый аргумент с python или pkill, и печатает его, если это так. А ловушка использует BASH_COMMAND (который содержит команду, которая будет выполнена) в качестве первого аргумента.

$ bash foo.sh dev
python ascript.py
python: can't open file 'ascript.py': [Errno 2] No such file or directory
$ bash foo.sh prod
It doesn't look like you're running me as root. This probably won't work. Press any key to continue.

pkill -f nginx
foo.sh: line 32: nginx: command not found

Обратите внимание, что хотя в case используются глобы, вы можете с тем же успехом сделать:

if [[ $1 =~ python|nginx ]]
then
    printf "%s" "$*"
fi

И использовать регулярные выражения.

1
27.01.2020, 19:45

Теги

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