bashスクリプトエラーstty:標準入力:デバイスの不適切なioctl


15

パスワードが何度も必要なインストールとセットアップを自動化するために、bashスクリプトでヒアドキュメントを使用しています。パスワードを1回入力すると、スクリプトはそれをさまざまなコマンドに渡します。ほとんどの場合、ヒアドキュメントアプローチがこの罰金を処理します。ただし、ある場合にはこのエラーが発生します。

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

このエラーメッセージはx11vnc -storepassword(ではなく)からのものであることに注意してくださいsudo

私の問題は関連してx11vnc -storepasswdおり、ここに私のコードがあります:

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

それは明らかに(エラーから)動作しません。sudo x11vnc -storepasswd ~/.vnc/passwdスクリプトに実装する方法の実用例に感謝します。

役立つ場合、プロンプトは次のようになります。

VNCパスワードの入力:パスワードの
確認:
/home/user/.vnc/passwdにパスワードを書き込みますか?[y] / nn

使用expectする方が良い解決策でしょうか?もしそうなら、この場合どのように使用しますか?(これまで使用expectしたことはありませんが、この質問を投稿してから多くの例を見てきましたexpect。自分で作業することはできません。)

回答:


3

x11vnc標準入力は端末であると想定し、入力中にパスワードがエコーされないように端末モードを変更します。標準入力が端末ではない場合、sttyエコーをオフにしてオンに戻す呼び出しは失敗するため、警告が表示されます。

Expectは確かに解決策です。このスクリプトを試してください(テストされていません):

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

または、可能であれば、RFB(-passwdfile、またはSSLクライアント証明書)以外の認証方法を使用します。


ありがとう。ただし、エラーの原因はからsudoではありませんx11vnc -storepassword。私はさまざまなexpectアプローチを試みてきましたが、それを正しくすることができないようです。expectパスワードの入力に使用する例は大x11vnc -storepassword歓迎です。混乱を避けるため、質問を更新します。
MountainX-for-Monica

@MountainXそうですね、ごめんなさい、質問を読み間違えたでしょう。ここに期待されるスクリプトがあります(完全にテストされていません)。
ジル 'SO-悪であるのをやめる'

ありがとうございました。あなたのテストされていないスクリプトは私にいくつかの追加の手がかりを与えましたが、最終的にはエラーなしで実行されません。エラーは単にEnter VNC password: usage: send [args] string行にありexpect "password:" {send "swordfish" "\r"}ます。私はそれを修正する方法がわかりません。Expectは非常にうるさいツールのようです。なぜなら、私はこの特定の問題を何時間もだまして、まだ結果が出ていないからです。
MountainX-for-Monica

エラー(上記のコメント)の原因でsend "swordfish" "\r"あり、によって解決されましたsend "swordfish\r"。ただし、解決策はまだ機能しません。〜/ .vnc / passwdにパスワードは書き込まれません。理由はまだわかりません。私が言ったように、私はこれまでに考えられるすべてを試しているにもかかわらず、この結果を見てきました。
MountainX-for-Monica

ところで、expectソリューションで使用されるのと同じコマンドは、手動で入力したときに機能します。このexpectスクリプトまたはこれまでに試したバリエーションでは機能しません。
MountainX-for-Monica

5

これらの警告メッセージを回避する別のオプションはx11vnc、UNIXコマンドによって作成された疑似端末で実行することです(対話式プログラムを制御するための疑似端末(pty)の使用を参照)。これはscriptpdip(「対話型プログラムを使用したプログラムされたダイアログ」)などのコマンドまたはツールを使用して実行できます。

Mac OS X 10.6.8での擬似端末を提供しないための警告メッセージ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

scriptコマンドを使用したソリューション:

# 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には、-SSTDINからパスワードを読み取ることができるオプションがあります。

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

以下に、プロセスを示すスクリプトの例を示します。

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

あなたのスクリプトは、単に次のようなことをする必要があります:

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

これにより、パスワードをハードコードすることなく、スクリプトでsudoコマンドを使用できます。

または、ユーザーまたはユーザーのサブセットに、パスワードなしでsudoを使用してx11vncを実行する機能を追加できますが、次のような行を追加します/etc/sudoers

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

または、vncusersグループを作成し、そのグループにユーザーを追加してから、次を追加します/etc/sudoers

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

ありがとう。ただし、エラーの原因はからsudoではありませんx11vnc -storepassword
MountainX-for-Monica
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.