Intereting Posts
Являются ли контейнеры и гипервизоры альтернативой многоуровневым дистрибутивам на основе графического интерфейса? Поиск файла, который создал X минут назад (без поиска GNU / BSD) sudo: невозможно разрешить хост "hostname" Приложение, которое позволяет отображать содержимое буфера обмена и его тип MIME? понимание LAMP: linux apache mysql и php Не удалось загрузить файл com32 vesamenu.c32 на установку centOS XRandR отображает область отображения в некоторых конфигурациях с несколькими мониторами Что означает режим raw / unraw клавиатуры? Почему «-» в «#! / bin / sh – "shebang? Как заставить создать символическую ссылку? Переход на виртуальный терминал медленный Видео чата Google – Fedora / Google Chrome эквивалент правила iptables в ip6tables Флокирование filedescriptor в сценарии оболочки Для перенаправления ввода существуют функциональные различия между bash / zsh <<< «$ (<файл)» и традиционным <file?

Команда не выполняется через SSH

Я сделал этот сценарий для курса. Он выполняет команды через ssh из аргументов скрипта на нескольких удаленных серверах, указанных в файле:

#!/bin/bash # The server file. Can be changed with the -f argument SERVER_FILE='/vagrant/servers' # The function to check if the chosen SERVER_FILE exists filecheck() { if [[ ! -e $SERVER_FILE ]]; then echo "The file $SERVER_FILE does not exist." >&2 exit 1 fi } # The usage statement usage() { echo "usage $0 -vsn -f FILE 'COMMAND'" echo " -v Verbose mode" echo " -s Run command as sudo on remote server" echo " -n Dry run, commands not actually executed" echo " -f FILE Selects a different file other than /vagrant/servers" exit 1 } # The verbose mode text things say() { if [[ $VERBOSE = 'true' ]]; then echo "$@" fi } # The ssh command sshing() { ssh -o ConnectTimeout=2 $SERVER $@ } # User executing the command should not be root if [[ $UID -eq 0 ]]; then echo "You should not execute this script with sudo or as root" >&2 echo "Use the -s argument if you want sudo powers" >&2 exit 1 fi # DRYMODE is sshing by Default DRYMODE='sshing' #check to see if file SERVER_FILE exists filecheck # The options for the script while getopts vsnf: OPTION; do case $OPTION in v) echo "Verbose mode on" VERBOSE='true' ;; s) say "Sudo mode" SUDO='sudo' ;; n) say "Dry run mode" DRYMODE='echo' DRYRUN='DRY RUN: ' echo "DRY RUN MODE ON: " echo ;; f) say "Different file mode" SERVER_FILE=${OPTARG} #check to see if file SERVER_FILE exists filecheck ;; *) usage ;; esac done echo # shifts so that the options are removed from the list of arguments shift $((OPTIND-1)) #Set a variable for the rest of the arguments, as a command COMMAND="${@}" # Checks if the user provided any arguments apart from the optinos if [[ $# -eq 0 ]]; then usage exit 1 fi # Executes the commands for SERVER in $(cat ${SERVER_FILE}); do say "Executing ${COMMAND} on ${SERVER}:" $DRYMODE $DRYRUN $SUDO ${COMMAND} 2> /dev/null CMDEX=$? # if the exit status is 255, something is wrong with the server or is unreachable if [[ $CMDEX -eq 255 ]]; then echo "The server you're trying to reach does not exist or is unreachable. Aborting." >&2 exit 1 fi # if the exit status is non 0 and non 255, something is wrong with the command if [[ $CMDEX -ne 0 ]]; then echo "Invalid command ${COMMAND} or wrong syntax. Aborting." >&2 exit 1 # if the exit status is non 0 and non 255, something is wrong with the command fi say "Command ${COMMAND} executed successfuly." done exit 0 

И он отлично работает для простых команд (таких как ls , ps и даже adduser test ), но он просто прерывается, если я дам ему любую команду, которая будет содержать двойные кавычки, ЕСЛИ Я не заключаю в одинарные кавычки всю команду.

Теперь я не знаю, является ли это ошибкой в ​​моем коде или чем-то, но я не могу передать команды через это.

Так что эта команда не работает:

 [vagrant@admin01 vagrant]$ ./run-everywhere.sh -sv 'echo 1 | passwd --stdin test4' 

Если я вырвусь из трубы с \ | он буквально записывает это как \ |. Эта другая команда также не работает:

 [vagrant@admin01 vagrant]$ ./run-everywhere.sh -sv 'echo "1" | sha256sum > file1' 

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

Я обнаружил проблему с неработающим конвейером: я должен написать sudo ПОСЛЕ конвейера, если команде нужны привилегии sudo. Этот работает следующим образом:

 [vagrant@admin01 vagrant]$ ./run-everywhere.sh -sv 'echo 1 | sudo passwd --stdin test4' 

Я все еще не могу перенаправить, хотя.

Попробуй это:

 sshing () { ssh -o ConnectTimeout=2 "$SERVER" "$@" # ................................^..^ crucial quotes } # ... cmd="$*" # ... while read -r SERVER; do say "Executing ${COMMAND} on ${SERVER}:" $DRYMODE $DRYRUN $SUDO sh -c "${COMMAND}" 2> /dev/null # .....................11111.2..........2 # 1. run with a shell to enable redirections and pipe # 2. crucial quotes # ... done < "$SERVER_FILE" 

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

Кроме того, вы должны избавиться от привычки использовать имена переменных ALLCAPS. Однажды вы случайно перепишете PATH, а потом удивитесь, почему ваш скрипт не работает.

Нашел проблему. Если бы я запускал скрипт с полномочиями sudo, чтобы самому касаться некоторых файлов, он создавал файлы под именем и группой root, что означало, что у меня не было разрешений на этот файл.