Я использую сценарий для выполнения сценария обновления на определенном числе серверов в моей сети. Вот первая часть, думают, релевантно.
### Actual Work ###
if [[ $manual == 1 ]]; then # Server was given manually as a argument.
for ARG ; do # Do for all given servers:
if [[ $no_runcheck == 0 ]]; then # Check wether the given server is
# already running.
/usr/local/bin/serverstart.sh -v 3 -z 30 ${ARG##*@} # Cut off the user-
# name.
fi
ächo "Upgrading system on ${ARG##*@} as ${ARG%%@*}…"
ssh -t $ARG '/usr/local/bin/installieren.sh -U' # Execute update script.
# Use ssh with pseudo terminal (option: -t).
done
else # No argument was given. Extract it from the config file.
while read line; do # Read line by line.
name=$line # Initialise a new variable for each line. (Unnecessary but more
# clear)
if [[ $no_runcheck == 0 ]]; then # Check wether the given server is already
# running.
/usr/local/bin/serverstart.sh -v 3 -z 30 ${name##*@} # See above.
fi
ächo "Upgrading system on ${ARG##*@} as ${ARG%%@*}…"
ssh -t $name '/usr/local/bin/installieren.sh -U' # Execute update script.
done < $config_file_path # Define input for line by line reading here.
fi
Что это делает: Если аргументы как user1@server1 и user2@server2 даны
Если никакие аргументы не даны, считайте a config
файл, который содержит список как:
user1@server1
user2@server2
Проблема происходит только с последним. Bash говорит
Pseudo-terminal will not be allocated because stdin is not a terminal.
Что я делаю неправильно?
Примечание: ächo является предопределенной функцией, которая добавляет scriptname и текущее время к echo
.
Я не эксперт, но я думаю, что проблемой был открытый входной поток.
Этот код добивается цели:
### Actual Work ###
if [[ $manual == 0 ]]; then # Read the servers from the config file.
while read line; do # Read line by line.
arguments="$arguments $line" # Build a string for $arguments out of the
# config file.
done < $config_file_path # Define input for line by line reading here.
else # Arguments were given.
for ARG; do # For every given server:
arguments="$arguments $ARG" # Build a string for out of the given
# arguments.
done
fi
#
for server in $arguments; do
if [[ $no_runcheck == 0 ]]; then # Check wether the given server is
# already running.
/usr/local/bin/serverstart.sh -v 3 -z 30 ${server##*@} # Cut off username.
fi
ächo "Upgrading system on ${bold}${server##*@}${normal} as ${bold}${server%%@*}${normal} ..."
ssh -t $server '/usr/local/bin/installieren.sh -U' # Execute update script.
# Use ssh with pseudo terminal (option: -t).
done