Komut satırında otomatik olarak giriş girin


141

Her işlem için 'y' yazmayı istediği bir komut dosyası çalıştırıyorum, $ ./script < echo 'yyyyyyyyyyyyyy'tüm girişlerimi bir seferde geçirmek gibi bir çözüm arıyorum .


Bazen -fseçenek belirli komutlarla iyi çalışır.
iammilind

Yanıtlar:


257

Bu durumda özel olarak oluşturulan bir komut var: yes

$ yes | ./script

Bunun yaptığı şey, çıktılarını yesgirişine bağlamaktır ./script. Bu yüzden ./scriptkullanıcı girişi istediğinde, bunun yerine çıktısını alır yes. Çıkışı, ardından gelen yeni bir satır yesolan sonsuz bir akış y. Yani temelde kullanıcı yher soru için giriyor sanki ./script.

nEvet ( y) yerine hayır ( ) demek istiyorsanız, bunu şöyle yapabilirsiniz:

$ yes n | ./script

Bazı araçların her zaman yescevap olarak kabul etme seçeneği olduğunu unutmayın . Örnek için buraya bakınız: 'apt-get upgrade' içindeki evet / hayır istemini atlayın


Giriş girmek için diğer yöntemler:

yKomut dosyanızın tam olarak kaç tane beklediğini biliyorsanız, aşağıdaki gibi yapabilirsiniz:

$ printf 'y\ny\ny\n' | ./script

Newlines ( \n), giriş tuşlarıdır.

printfBunun yerine kullanarak yesdaha hassas girdi kontrolü elde edersiniz:

$ printf 'yes\nno\nmaybe\n' | ./script

Bazı nadir durumlarda komutun kullanıcının karakterden sonra enter tuşuna basmasını gerektirmediğini unutmayın. bu durumda yeni satırları dışarıda bırakın:

$ printf 'yyy' | ./script

Bütünlüğü sağlamak için burada bir belge de kullanabilirsiniz :

$ ./script << EOF
y
y
y
EOF

Veya kabuğunuz burada bir dize destekliyorsa :

$ ./script <<< "y
y
y
"

Veya satır başına bir giriş içeren bir dosya oluşturabilirsiniz:

$ ./script < inputfile

Komut yeterince karmaşıksa ve yukarıdaki yöntemler artık yeterli değilse, beklentinizi kullanabilirsiniz .

İşte bir süper basit bekliyor komut dosyası örneği:

spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof

Teknik nitpick:

Sorunuzda verdiğiniz varsayımsal komut çağrısı çalışmıyor:

$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory

Bunun nedeni, kabuk dilbilgisinin komut satırının herhangi bir yerinde bir operatöre yönlendirilmesine izin vermesidir. Kabuk söz konusu olduğunda, varsayımsal komut satırınız bu satırla aynıdır:

$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory

Bu ./script, argümanla çağrılacak 'yyyyyyyyyyyyyy've stdin adlı bir dosyadan girdi alacaktır echo. Ve dosya olmadığından bash şikayet ediyor.


1
Anladım cannot enable tty mode on non tty input. Bunun için bir geçici çözüm biliyor musunuz?
bmpasini

printfHile runkurulum sürecini otomatikleştirmek için gereken bir dosyayla denediğimde, olan tek şey bir hata mesajı alıyorum Warning: Tried to connect to session manager, None of the authentication protocols specified are supportedve komut dosyası yeni bir terminalde açılıyor ve girişimi her zamanki gibi manuel olarak girmemi istiyor. Bu arada Debian'da oluyor. Baska öneri?
DavidB,

daha fazla ayrıntıya ihtiyacım var. Yorumlarınız için çok büyük. Lütfen tüm detayları içeren yeni bir soru sorun. buraya bir link koyabilirsiniz.
lesmana

hiçbir şey centos üzerinde 'serseri yok' ile çalışma
Drew

Kötü kolay! Google Cloud Beta SQL veri ithalatında çalışıyor! Çok takdir!
G_Style

11

Komutu kullanın yes:

yes | script

Man sayfasından alıntı:

NAME
       yes - output a string repeatedly until killed

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or 'y'.

9

Bazı şeyler ( apt-getörneğin) sessiz modda çalışmak için özel bayraklar kabul eder (ve varsayılanları kabul eder). Bu apt-getdurumda, sadece bir -ybayrakla geçersiniz . Bu tamamen sizin betiğine bağlıdır.

Daha karmaşık şeylere ihtiyacınız varsa, betiğinizi bir bekleme betiğine sarabilirsiniz. bekliyoruz çıktıyı okumanıza ve girdi göndermenize izin verir, böylece diğer komut dosyalarının izin vermeyeceği karmaşık işleri yapabilirsiniz. İşte Wikipedia sayfasındaki örneklerden biri :

# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof

Bu bir .shkabuk betiği ile kullanılamaz , değil mi? Yoksa bir yolu var mı?
Shayan

7

Kabuk betiğinde ayrıca aşağıdaki yumurtlama hilesini kullanabilirsiniz, bekleyin ve gönderin

spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"

Ancak yukarıdaki senaryoda, daha fazla örnek için betiği yürütürken almayı beklediğiniz ifadeyi vermek zorunda kalacaksınız.

Bash içinde bekliyoruz


2

Tamam, bu çok zarif bir çözüm olmayabilir, ancak seçeneklerinizi ayrı bir dosyaya yazar ve sonra betiğe girdi olarak iletirseniz, de işe yarayabilir. Bu nedenle, tüm seçeneklerinizle yeni bir dosya oluşturursanız (bu dosyayı 'options.in' olarak adlandırın), komut dosyanızı kolayca çalıştırabilir ./script.sh < options.inve farklı seçenek dosyalarını uygun şekilde düzenleyebilir / oluşturabilirsiniz.


options.inDosyayı nasıl yazmalıyım ? Bir örnek verebilir misin?
Shayan

0

Dialog ile bir bash betiği yazıyordum ve bunun da otomatik olarak gerçekleşmesi gerekiyordu. Bunu yaptım ve bir cazibe gibi çalıştı.

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog

-1

Betiğinize kullanıcı girişini cat, bir metin dosyasından betiğinize şu şekilde aktarılmış olarak sağlayabilirsiniz bash:

cat input.txt | bash your_script.sh

İstediğiniz kullanıcı girişini input.txt dosyasına, istediğiniz cevapları ne olursa olsun - y, n, rakamlar, karakter dizileri, vs.



@muru Bana göre, bahsettiğiniz çözüm işe yaramadı, bu yüzden kendimi icat etmeliyim.
WebComer

Olası olmayan. İkiniz de aynı şeyi tarif ediyorsunuz.
muru

@muru Dosyadan tedarik etme fikri (aynı şekilde birkaç yolla yapılabilir) aynı şey değildir ve ayrıca oldukça farklı bir yolla başarılmıştır. Onu görebilmelisin. Belirttiğiniz çözüm benim için işe yararsa, vaktimi bugün tekerleği yeniden icat etmeye harcamam. Sizin için ne işe yararsa onu kullanabilirsiniz.
WebComer

@muru İki tanesi arasında bir fark olduğuna inanıyorum, bunlardan bazıları cevaplarda açıklanmıştır, askubuntu.com/questions/172982/… . Benim için, örneğin, çıktı dosyaya yönlendirilirse kodum soldan sağa doğal bir akış olarak daha net görünüyor. Sonuçta, sizin gibi iyi çözümler için aşağı oy kullanmak insanları burada çözümlerini paylaşmaya teşvik etmiyor. Bunun, aşağı oylamayı kaldırmak için yeterli olduğuna inanıyorum.
WebComer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.