Гибридный код в сценариях оболочки. Совместное использование переменных

Так rswrk01 и co являются пользователями. Иногда полезный из kill это, если Вы передаете-1 как PID, сигнал отправляется во все процессы, в которые отправитель сигнала имеет разрешение отправить сигналы. Другими словами, для некорневого пользователя, kill -$sig -1 отправляет сигнал во все процессы, работающие как тот пользователь. Это включает уничтожителя, но доставка является атомарной, таким образом, все соответствующие процессы действительно получают сигнал.

Теперь все, что необходимо сделать, помещается это в цикле, и Вы сделаны. Начиная с форматирования чисел с продвижением обнуляет, что-то вроде боли, не очень привлекательный, но удобный прием должен поместить продвижение 1 (т.е. количество от 101 до 198, а не 1 - 98), и снимают изоляцию с этого.

i=101
while [ $i -le 98 ]; do
  sudo su - rswrk${i#1} kill -KILL -1
  i=$((i+1))
done

Или в ksh:

for ((i=101; i<=198; i++)); do
  sudo su - rswrk${i#1} kill -KILL -1
done

Или в ударе или zsh:

for i in {01..98}; do
  sudo su - rswrk$i kill -KILL -1
done

10
23.05.2017, 15:39
4 ответа

Получение переменной к Python

С тех пор (когда EOF маркер не заключается в кавычки), подстановка переменных происходит, прежде чем текст передается от heredoc до pythonстандартный вход, можно бросить переменную прямо в сценарий.

python - <<EOF
some_text = "$some_text"
EOF

Если some_text был test, Python видел бы some_text = "test". Обратите внимание однако, что это может рассматриваться как уязвимость инжекции кода. Если some_text был "; import os; os.system("evil-command"); x = ", например, Python видел бы:

some_text = ""; import os; os.system("evil-command"); x = ""

и выполненный та злая команда.

Если Вы хотите смочь вытянуть свой код Python прямо в сценарий без каких-либо модификаций, Вы могли экспортировать свою переменную.

export some_text

и используйте os.environ получать его.

some_text = os.environ['some_text']

Это - намного более нормальный/более безопасный подход.


Быть произведенным из Python

Можно использовать замену команды для сбора вывода сценария.

output=$(
python - <<EOF
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF
)

(обратите внимание, что все запаздывающие символы новой строки удалены),

12
27.01.2020, 19:59
  • 1
    Это выглядит большим. Когда Вы сказали "You could also pass the variable to the script as an argument", как Вы сделали бы то рассмотрение, что сценарий Python встраивается в рамках сценария оболочки? –  Amelio Vazquez-Reina 01.05.2013, 01:18
  • 2
    Извините, я забыл об этом в течение секунды. Я удалил то решение и добавил лучшее решение. –   01.05.2013, 01:22
  • 3
    Будьте осторожны, как Вы называете heredoc маркер. Когда это закроет кавычки как в Вашем примере, расширение оболочки произойдет в строке heredoc. Например, если Ваш код Python состоял из просто print '$SHELL', вывод был бы /bin/bash или независимо от того, что Ваша оболочка, оказывается. Если Вы изменяете первую строку на python - <<'END', вывод был бы $SHELL. Если Вы копируете и вставляете существующий код для встраивания в сценарий удара, Вы почти наверняка не хотите замен оболочки - Вы хотите, чтобы код выполнил тот же способ, которым он делает, когда он не встраивается в сценарий удара, правильно? –  Chris Johnson 17.08.2015, 22:03

Используйте тире в качестве имени файла:

ruby - a b <<'END'
puts ARGV.join(",")
END

python - a b <<'END'
import sys
print ",".join(sys.argv[1:])
END

Я не знаю если sys.argv[1:] правильный путь состоит в том, чтобы сделать это в Python. Для-e/-c Вы может указать конец споров с-:

set -- -a -b -c
ruby -e 'puts ARGV.join(",")' -- "$@"
python -c 'import sys; print ",".join(sys.argv[2:])' -- "$@"

Получение вывода и перенаправление STDERR:

x=$(ruby <<'END' 2> /dev/null
puts "a"
abort "b"
END
)
6
27.01.2020, 19:59

1) Вы могли записать переменные присвоения на файл в Python и затем источник это в Вашем сценарии удара.

2) Так как Ваше слово (EOF) не заключается в кавычки, все строки здесь-документа подвергаются расширению параметра. Можно использовать это для передачи материала сценарию Python.

2
27.01.2020, 19:59

Проблема с Вашим подходом состоит в том, что встроенный сценарий Python больше не имеет доступ к исходному stdin (так как его stdin... самостоятельно).

Если это - проблема, можно записать:

python -c '
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
'

Или если сценарий Python может содержать одинарные кавычки:

python -c "$(cat << 'EOF'
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF
)"

Или:

python <(cat << 'EOF'
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF
)
8
27.01.2020, 19:59

Теги

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