bash script error stty: input standar: ioctl tidak sesuai untuk perangkat

15

Saya menggunakan di sini-dokumen dalam skrip bash untuk mengotomatiskan instalasi dan pengaturan di mana kata sandi diperlukan berkali-kali. Saya memasukkan kata sandi sekali dan skrip meneruskannya ke berbagai perintah. Dalam kebanyakan kasus, pendekatan dokumen di sini menangani masalah ini. Namun, dalam satu kasus saya mendapatkan kesalahan ini:

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

Harap perhatikan bahwa pesan kesalahan ini berasal dari x11vnc -storepassword(bukan dari sudo.)

Masalah saya terkait dengan x11vnc -storepasswddan ini kode saya:

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

Itu jelas (dari kesalahan) tidak berfungsi. Saya akan menghargai contoh kerja tentang cara menerapkan sudo x11vnc -storepasswd ~/.vnc/passwddalam skrip.

Jika itu membantu, petunjuknya terlihat seperti ini:

Masukkan kata sandi VNC:
Verifikasi kata sandi:
Tulis kata sandi ke /home/user/.vnc/passwd? [y] / nn

Apakah menggunakan expectmenjadi solusi yang lebih baik? Jika demikian, bagaimana saya menggunakannya dalam kasus ini? (Saya belum pernah menggunakan expectsebelumnya tetapi saya telah melihat banyak contoh sejak memposting pertanyaan ini dan saya tidak bisa expectbekerja sendiri.)

MountainX-for-Monica
sumber

Jawaban:

3

x11vncmengharapkan input standarnya menjadi terminal, dan itu mengubah mode terminal untuk menghindari pengulangan kata sandi saat Anda mengetik. Ketika input standar bukan terminal, sttypanggilan untuk mematikan dan mengaktifkan kembali gagal, karena itu peringatan yang Anda lihat.

Harapkan memang solusi. Coba skrip ini (belum diuji):

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

Atau, jika Anda bisa, gunakan metode otentikasi selain RFB ( -passwdfile, atau sertifikat klien SSL).

Gilles 'SO- berhenti menjadi jahat'
sumber
Terima kasih. Namun, kesalahan itu bukan berasal dari sudoitu berasal dari x11vnc -storepassword. Saya telah mencoba berbagai expectpendekatan dan sepertinya saya tidak bisa melakukannya dengan benar. Contoh menggunakan expectuntuk memasukkan kata sandi x11vnc -storepasswordakan sangat dihargai. Saya akan memperbarui pertanyaan saya untuk menghindari kebingungan lebih lanjut.
MountainX-for-Monica
@ GunungX Benar, maaf, saya salah membaca pertanyaan. Berikut ini skrip harapan (sama sekali belum diuji).
Gilles 'SO- stop being evil'
Terima kasih. Skrip Anda yang belum diuji memberi saya beberapa petunjuk tambahan, tetapi pada akhirnya skrip ini juga tidak berjalan tanpa kesalahan. Kesalahannya hanyalah Enter VNC password: usage: send [args] stringdi telepon expect "password:" {send "swordfish" "\r"}. Saya tidak yakin bagaimana cara memperbaikinya. Harapkan tampaknya menjadi alat yang sangat pemilih karena saya telah membodohi masalah khusus ini selama berjam-jam tanpa hasil yang berhasil.
MountainX-for-Monica
Kesalahan (komentar di atas) berasal dari send "swordfish" "\r"dan diselesaikan oleh send "swordfish\r". Namun, solusinya masih belum berhasil. Tidak ada kata sandi yang ditulis ke ~ / .vnc / passwd. Saya masih tidak mengerti mengapa. Seperti yang saya katakan, saya telah melihat hasil ini meskipun mencoba semua yang saya bisa pikirkan sejauh ini.
MountainX-for-Monica
BTW, perintah yang sama yang digunakan dalam expectsolusi Anda berfungsi saat dimasukkan secara manual. Mereka tidak bekerja dalam expectskrip ini atau variasi apa pun yang telah saya coba sejauh ini.
MountainX-for-Monica
5

Opsi lain untuk menghindari pesan-pesan peringatan tersebut adalah dengan mengeksekusi x11vncdi pseudo-terminal yang dibuat oleh perintah UNIX (lihat Menggunakan pseudo-terminal (pty) untuk mengontrol program interaktif ). Ini dapat dilakukan dengan scriptperintah atau alat seperti pdip("Dialog terprogram dengan Program Interaktif").

Pesan peringatan pada Mac OS X 10.6.8 karena tidak menyediakan terminal semu untuk 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

Solusi menggunakan scriptperintah:

# 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
kalou
sumber
1

Sudo memiliki opsi -Syang memungkinkannya untuk membaca passwd dari STDIN.

[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::::::

Berikut ini contoh skrip untuk menunjukkan proses:

#!/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

Script Anda, hanya perlu melakukan sesuatu seperti:

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

Ini memungkinkan Anda untuk menggunakan perintah sudo dalam skrip Anda tanpa harus membuat hardcode kata sandi.

Sebagai alternatif, Anda dapat menambahkan pengguna Anda, atau subset pengguna, kemampuan untuk menjalankan x11vnc dengan sudo, tanpa kata sandi, tetapi menambahkan baris seperti ini ke /etc/sudoers:

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

Atau buat vncusersgrup, tambahkan pengguna ke grup itu, dan tambahkan berikut ini ke /etc/sudoers:

%vncusers    ALL=(root) NOPASSWD: /path/to/x11vnc
Tim Kennedy
sumber
Terima kasih. Namun, kesalahan itu bukan berasal dari sudoitu berasal dari x11vnc -storepassword.
MountainX-for-Monica