Citat:
Ursprungligen postat av
Enterprise
Jag kollade på denna bash-fil. Den kör en Python-fil, så det är inget i själva bash-filen man kan modifiera för att ta bort störningsmomement som du är ute efter. I så fall får man modifiera Python-filen vilket känns roddigare.
Prova att ladda ner bash-filen lokalt först (i t.ex. ~\scripts) och ge den rättigheter att köras (chmod +x).
Prova sen:
Kod:
yes ‘’ | ~\scripts\InstallAzureCli
Alltså att du
inte kör den i en separat bash-miljö.
Alternativet så testar du att ändrar sista raden i Bash-filen (InstallAzureCli) till:
Kod:
yes ‘’ | $python_cmd $install_script
Tror den gamla referensen till /dev/tty omöjliggör piping från yes. Så här såg alltså ursprungsraden ut:
Kod:
$python_cmd $install_script < $_TTY
Där $_TTY = /dev/tty
Helt rätt Enterprise du tror helt rätt. Jag tror inte ens det skulle inte fungerat med heredoc i shell faktiskt. Det hade bara räckt att ta bort < $_TTY.
Detta är ett jobb för expect om det hade varit fortfarande aktuellt eller göra som enterprise skrev, ta bort < $_TTY.
Intressant script just med < $_TTY. Sällan man ser så bra skrivna script men det verkar vara Microsoft som skrivit det och det finns inga fel alls inte ett ända. Hade dom bara satt quotes runt alla variabler så hade dom sluppit eventella globbing och word splitting men det är beroende på men i detta fallet är det inte nödvändigt:
https://www.shellcheck.net/wiki/SC2086
Blev intresserad av det Enterprise skrev med < $_TTY så jag kollade in scriptet bara..
En lösning hade varit:
Kod:
curl -L https://aka.ms/InstallAzureCli | sed -e 's/< $_TTY//' | bash
Kod:
command=$(curl -L https://aka.ms/InstallAzureCli | sed -e 's/< $_TTY//')
eval "$command"
Eller mer säkert
Kod:
command=$(curl -L https://aka.ms/InstallAzureCli | sed -e 's/< $_TTY//')
allowed_pattern="^[a-zA-Z0-9_ ;&|()<>\$']*\$"
if [[ $command =~ $allowed_pattern ]]; then
eval "$command"
else
echo "Input contains disallowed characters. Shell injections is not going to work"
fi
Citat:
Jag har fösökt komma runt problemet genom att göra följande:
Yes fungerar enbart om read prompt finns, här kan du se att den inte triggas på ett enkelt sätt:
Kod:
echo "Do you want to continue? (yes/no)"
yes | while read -r response; do
case $response in
[Yy]* ) echo "You chose to continue."; break;;
[Nn]* ) echo "You chose to stop."; break;;
* ) echo "Please answer yes or no.";;
esac
done
Därför fungerade inte det med yes ''| men de hade funkat om read fanns.
Väldigt elegant på ett vis du har hittat här för att installera det on the fly. Så kan du göra om du inte har "deb" hanterare och vill installera det på någon annan dist iaf, här är en lösning om det hade varit tvunget att svara yes:
Kod:
expect -c '
spawn sh -c "while read -r response; do
case \$response in
[Yy]* ) echo \"You chose to continue.\"; break;;
[Nn]* ) echo \"You chose to stop.\"; break;;
* ) echo \"Please answer yes or no.\";;
esac
done"
expect "Do you want to continue? (yes/no)"
send "y\r"
expect eof
'