bash script error stty: standart girdi: Cihaz için uygun olmayan ioctl


16

Burada birçok kez parola gerekli kurulum ve kurulumu otomatikleştirmek için bir bash komut dosyasında belgeleri kullanıyorum. Parolayı bir kez giriyorum ve komut dosyası çeşitli komutlara geçiriyor. Çoğu durumda, buradaki belge yaklaşımı bu cezayı ele alır. Ancak, bir durumda bu hatayı alıyorum:

Enter VNC password: stty: standard input: Inappropriate ioctl for device
Verify password:    
stty: standard input: Inappropriate ioctl for device

Lütfen bu hata mesajının x11vnc -storepassword(kaynağından değil sudo) olduğuna dikkat edin .

Benim sorunum ile ilgili x11vnc -storepasswdve işte benim kod:

sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC
password
password
y
ENDDOC

Açıkçası (hatadan) çalışmıyor. sudo x11vnc -storepasswd ~/.vnc/passwdBir senaryoda nasıl uygulanacağının çalışan bir örneğini takdir ediyorum .

Yardımcı olması durumunda, istemler aşağıdaki gibi görünür:

VNC şifresini girin: Şifreyi
doğrulayın:
/home/user/.vnc/passwd? [y] / nn

Kullanmak expectdaha iyi bir çözüm olacak mı? Öyleyse, bu durumda nasıl kullanırım? (Daha expectönce hiç kullanmadım ama bu soruyu gönderdikten sonra birçok örneğe baktım ve expectkendi başıma çalışamıyorum.)

Yanıtlar:


3

x11vncstandart girişinin bir terminal olmasını bekler ve yazarken şifreyi tekrarlamaktan kaçınmak için terminal modunu değiştirir. Standart giriş bir terminal olmadığında, sttyyankıyı kapatıp tekrar açmak için yapılan aramalar başarısız olur, bu nedenle gördüğünüz uyarı.

Beklenti gerçekten bir çözümdür. Bu komut dosyasını deneyin (denenmemiş):

#!/usr/bin/expect -f
spawn x11vnc -storepasswd ~/.vnc/passwd
expect "password:" {send "swordfish" "\r"}
expect "password:" {send "swordfish" "\r"}
expect "Write*\?" {send "y\r"}

Alternatif olarak, mümkünse, RFB ( -passwdfileveya bir SSL istemci sertifikası) dışında bir kimlik doğrulama yöntemi kullanın .


Teşekkürler. Ancak hata sudoondan gelmiyor x11vnc -storepassword. Çeşitli expectyaklaşımlar deniyorum ve doğru anlayamıyorum. İçin expectbir şifre girmek için kullanılan bir örnek x11vnc -storepasswordçok takdir edilecektir. Daha fazla karışıklığı önlemek için sorumu güncelleyeceğim.
MountainX-for-Monica

@MountainX Doğru, üzgünüm, soruyu yanlış okudum. İşte bir beklenti betiği (tamamen denenmemiş).
Gilles 'SO- kötü olmayı bırak

Teşekkür ederim. Test edilmemiş betiğiniz bana birkaç ipucu daha verdi, ancak nihayetinde hatasız da çalışmaz. Hata sadece Enter VNC password: usage: send [args] stringsatırda expect "password:" {send "swordfish" "\r"}. Bunu nasıl düzeltebileceğimi bilmiyorum. Beklentiler çok seçici bir araç gibi gözüküyor, çünkü saatlerce bu özel problemi henüz çalışma sonuçları olmadan kandırıyorum.
MountainX-for-Monica

Hata (yorumun üstünde) geldi send "swordfish" "\r"ve tarafından çözüldü send "swordfish\r". Ancak, çözüm hala çalışmıyor. ~ / .Vnc / passwd dizinine şifre yazılmamış. Hala neden olduğu konusunda bilgim yok. Dediğim gibi, şimdiye kadar aklıma gelen her şeyi denememe rağmen bu sonucu görüyorum.
MountainX-for-Monica

BTW, expectçözümünüzde kullanılan komutların aynısı manuel olarak girildiğinde çalışır. Bu expectsenaryoda veya şimdiye kadar denediğim herhangi bir varyasyonunda çalışmıyorlar .
MountainX-for-Monica

5

Bu uyarı mesajlarından kaçınmak için başka bir seçenek, x11vncUNIX komutu tarafından oluşturulan bir sözde terminalde yürütmektir (etkileşimli programları kontrol etmek için sözde terminalleri (pty) kullanma ). Bu scriptkomut pdip("Etkileşimli Programlarla Programlanmış Diyalog") gibi komut veya araçlarla yapılabilir .

Mac OS X 10.6.8'de aşağıdakiler için sahte bir terminal sağlamadığına ilişkin uyarı mesajları x11vnc:

# x11vnc 0.9.14
sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC
password
password
y
ENDDOC

# Enter VNC password: stty: stdin isn't a terminal
#
# Verify password:    
# stty: stdin isn't a terminal
# Write password to ~/.vnc/passwd?  [y]/n Password written to: ~/.vnc/passwd

scriptKomutu kullanarak çözümler :

# GNU script command
sudo script -q -c 'x11vnc -storepasswd ~/.vnc/passwd' <<ENDDOC /dev/null
password
password
y
ENDDOC

# ... or ...
printf '%s\n' 'password' 'password' 'y' | 
   sudo script -q -c 'x11vnc -storepasswd ~/.vnc/passwd' /dev/null


# FreeBSD script command
sudo script -q /dev/null x11vnc -storepasswd ~/.vnc/passwd <<ENDDOC
password
password
y
ENDDOC

1

Sudo'nun -Sşifresini STDIN'den okumasına izin veren bir seçeneği var.

[user@evil ~]$ tail -1 /etc/shadow
tail: cannot open `/etc/shadow' for reading: Permission denied
[user@evil ~]$ echo 'P@ssW3rd!' | sudo -S tail -1 /etc/shadow
nfsnobody:!!:15891::::::

İşlemi gösteren örnek bir komut dosyası:

#!/bin/bash

function hr {
    perl -e 'print "-" x 80, "\n";'
}

hr
read -p "Please enter your sudo password: " -s sudopasswd
echo

hr
echo "-sudo run: tail -1 /etc/shadow"
tail -1 /etc/shadow

hr
echo "+sudo run: tail -1 /etc/shadow"
echo "$sudopasswd" | sudo -S tail -1 /etc/shadow

hr
echo "-sudo run: ls -la /root/"
ls -la /root/

hr
echo "+sudo run: ls -la /root/"
echo "$sudopasswd" | sudo -S ls -la /root/

hr

Senaryonuzun aşağıdaki gibi bir şey yapmanız yeterlidir:

read -p "Please enter your sudo password: " -s sudopasswd
echo "$sudopasswd" | sudo -S x11vnc -storepasswd ~/.vnc/passwd 

Bu, bir parolayı sabit kodlamak zorunda kalmadan betiğinizdeki sudo komutlarını kullanmanızı sağlar.

Alternatif olarak, kullanıcınızı veya bir kullanıcı alt kümesini, parola olmadan sudo ile x11vnc'yi çalıştırabilir, ancak aşağıdakine benzer bir satır ekleyebilirsiniz /etc/sudoers:

user    ALL=(root) NOPASSWD: /path/to/x11vnc

Veya bir vncusersgrup oluşturun , bu gruba kullanıcılar ekleyin ve aşağıdakileri ekleyin /etc/sudoers:

%vncusers    ALL=(root) NOPASSWD: /path/to/x11vnc

Teşekkürler. Ancak hata sudoondan gelmiyor x11vnc -storepassword.
MountainX-for-Monica
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.