2023-08-11, 23:28
  #1
Medlem
bithaxs avatar
Jag sitter och hackar på ett script för att sätta upp en gitpod.
Bland annat vill jag installera azure cli.

Problemet är att azure cli installern förväntar sig input, altså att man ska trycka enter för att den ska gå vidare.

Raden i fråga ser ut såhär
Citat:
curl -L https://aka.ms/InstallAzureCli | bash

Jag har fösökt komma runt problemet genom att göra följande:

Citat:
yes ' ' | (curl -L https://aka.ms/InstallAzureCli | bash)

men det funkar inte. Förmodligen för att den forkar av en process eller nått sånt.

Någon som har någon bra ide hur man kan göra?
Citera
2023-08-12, 00:31
  #2
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av bithax
Jag sitter och hackar på ett script för att sätta upp en gitpod.
Bland annat vill jag installera azure cli.

Problemet är att azure cli installern förväntar sig input, altså att man ska trycka enter för att den ska gå vidare.

Raden i fråga ser ut såhär


Jag har fösökt komma runt problemet genom att göra följande:



men det funkar inte. Förmodligen för att den forkar av en process eller nått sånt.

Någon som har någon bra ide hur man kan göra?
Modifiera bash-filen så du slipper trycka enter?
Citera
2023-08-12, 09:37
  #3
Medlem
Enterprises avatar
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
__________________
Senast redigerad av Enterprise 2023-08-12 kl. 09:54.
Citera
2023-08-14, 17:29
  #4
Medlem
bithaxs avatar
Jag hittade ett deb paket i stället jag kunde installera och löste det på det sättet i stället, men tack för hjälpen!
Citera
2023-10-01, 06:35
  #5
Bannlyst
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
'
__________________
Senast redigerad av namesuw 2023-10-01 kl. 07:02.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in