この投稿 で説明されているように、X
の仮想端末(VT)を変更するためのキーバインディングを設定しようとしました。ターミナルエミュレータにSudo chvt $(($XDG_VTNR-1))
と入力すると、VTが適切に変更されます。ただし、昇格された特権でchvt
を実行すると、ターミナルエミュレーター(_xterm -e
_など)へのコマンドとして実行された場合にのみ機能することがわかりました。これは、回避しようとしている要件です。
私のセットアップを説明するには:
次の行が_/etc/sudoers
_に追加されました。
_me ALL=NOPASSWD:/bin/chvt
_
ここで、me
はwhoami
の出力です。この行のバリエーションも試しました(例:me ALL=(ALL) NOPASSWD:/bin/chvt
およびme ALL=(ALL:ALL) NOPASSWD:/bin/chvt
)
_~/.xbindkeysrc
_に、次のいずれかのキーバインディングを追加しました。
_"Sudo chvt $(($XDG_VTNR-1))"
alt + c:113
"Sudo chvt $(($XDG_VTNR+1))"
alt + c:114
_
または
_"Sudo chvt $(($XDG_VTNR-1))"
m:0x8 + c:113
"Sudo chvt $(($XDG_VTNR+1))"
m:0x8 + c:114
_
前者はリンクされた投稿の作者によって提案され、後者は私のシステムで_xbindkeys -k
_を実行することによって決定されました。
キーバインディングが失敗し、調査のために非デーモンモードでxbindkeys
を実行しました。 _xbindkeys -n
_の実行中にAlt +左またはAlt +右を押すと、次のエラーが発生します。
_Sudo: no tty present and no askpass program specified
_
_~/.xbindkeysrc
_のコマンドを_xterm -e Sudo chvt ...
_に変更すると、有効なキーバインディングが生成されます(ただし、xterm
インスタンスを開き、パスワードの入力を求められます)。これにより、tty
の欠如が問題であることが確認されます。最初にSudo
を呼び出さずに、_.xbindkeys
_でterminal
を呼び出すにはどうすればよいですか?
システムの詳細:debian v9.2。、dwm v6.1、openbox v.3.6.1、xbindkeys v1.8.6、Sudo v1.8.19p1
セキュリティに配慮したデフォルト(または少なくともディストリビューションのデフォルトのsudoerに入れる)は、アプリケーションの違反による特権の昇格を防ぐために、ttyなしでSudoコマンドを許可しないことです。ショートカットを使用して実行するコマンドにはttyがないため、実行されません。この設定をグローバルに無効にすることもできますが、このコマンド以外のすべての設定を無効にすることをお勧めします。オプションの名前はrequiretty
です。
_Cmnd_Alias CHVT = /bin/chvt
me ALL = NOPASSWD: CHVT
Defaults!CHVT !requiretty
_
最初の_!
_は、次がCmnd_Aliasであることを意味し、2番目の_!
_は論理否定演算子です。したがって、chvtの実行はrequirettyから免除されます。ここでは、Cmnd_Aliasを使用する必要はありませんでしたが、オプション付きのコマンドを使用する場合、または2つのコマンドのrequirettyを無効にする場合は、構文で必要です。
注:他の設定によっては、これらの行の一部がキャンセルされる場合があります。したがって、sudoersの最後に配置する必要がある場合があります。おそらく%Sudo ALL=(ALL:ALL) ALL
のために、OPもこれを機能させるためにこれを行う必要があったようです。