「machinectl shell」またはsystemd-runがダイアログウィンドウの代わりに端末にパスワードを要求するようにするにはどうすればよいですか?
以下を使用してrootとしてコマンドを実行できます。
machinectl shell --uid=root --setenv='DISPLAY=:1.0' --setenv=SHELL=/bin/bash .host /bin/bash -lc 'startxfce4'
ただし、ダイアログウィンドウを使用してパスワードを要求します。
私はsudoと同じ動作をしたいです。 (sudoは簡単にスクリプトを書くために端末を使ってパスワードを要求します。)
SSHを使用して見つけた方法は次のとおりです。
ssh -t MyActualNormalUser@localhost
次に、上記と同じコマンドを実行します。
machinectl shell --uid=root --setenv='DISPLAY=:1.0' --setenv=SHELL=/bin/bash .host /bin/bash -lc 'thunar'
machineectlは、GUIダイアログの代わりに端末を使用してパスワードを要求します!
SSHを使用せずに同じ結果をどのように取得できますか? machineectl / pkexecが端末にパスワードを要求することを強制できますか?
なぜsudoを使用しないのですか? sudoは私が実行するコマンドのための新しいセッションを作成せず、machinectlは完全に別々のセッションを実行するので、スクリプトが簡単になります。 machineectl / pkexecを読むときに覚えている場合は、su / sudoが置き換えられます...
答え1
他のユーザーによるコマンドの実行
他のユーザーとして何かを実行するには他の方法があります。
機械制御:別のセッションが作成されます。
SSH:別のセッションが作成されます。
システム実行中:別々のセッションを作成するのではなく、セッションのように制御できる別のサービスユニットを作成します。たとえば、実行すると、
loginctl session-status
次のエラーが発生します。Could not get properties: Caller does not belong to any known session
セッションIDがないからです。プログラムの実行: 別のセッションを作成しません。
Sudo: 別のセッションを作成しません。
端末でパスワードを渡す方法(GUIではありません)
私達は次を使用できます:
プログラムの実行: pkttyagent が必要です。
機械制御:GUIを使用してパスワードを提供し、pkexec / sudoまたはsshを必要とするttyを使用してパスワードを渡す必要があります。
システム実行中:GUIを使用してパスワードを提供し、pkexec / sudoまたはsshを必要とするttyを使用してパスワードを渡す必要があります。
Sudo:sudoをpkexecに置き換える必要があります。
SSH:rootパスワードが必要な場合、またはpkexec / sudoまたはssh user@localhostを使用する必要があります。
結論として:
machinectlとsshだけが別々のセッションを提供し、systemd-runも良いがセッションを生成しないスクリプトでは動作します。
root権限を取得するには、pkexecを使用できます。
- 機械制御
timeout 3s sshpass -e pkttyagent -p $(echo $$) &
pkexec machinectl shell --uid=root --setenv="DISPLAY=:1.0" --setenv=SHELL=/bin/bash .host /bin/bash -lc "startxfce4"
- SSH
timeout 3s sshpass -e pkttyagent -p $(echo $$) &
pkexec ssh -t root@localhost "bash -lc 'export DISPLAY=:1.0 ; startxfce4'"
- システム実行中
timeout 3s sshpass -e pkttyagent -p $(echo $$) &
pkexec systemd-run --pty --pipe --wait --collect --service-type=exec --uid=root bash -lc "export DISPLAY=:1.0 ; export SHELL=/bin/bash ; startxfce4"
pkttyagent:pkexecがパスワードを求めるダイアログボックスGuiの代わりに端末を使用するように強制する必要があります。
タイムアウト3秒:pkttyagentが単独で終了しないために必要です。
答え2
ソリューション1
systemd-ask-password
を使用してbash変数にパスワードを割り当てることができます。
はい
password=$(systemd-ask-password --echo "machinectl password: ")
machinectl login {{ user }} $password
machinectl shell {{ your command }}
ソリューション2
machinectl --no-ask-password
ルートとしてドキュメントで次のものを使用できます。
--パスワードを聞かないでください。
特権タスクに対してユーザーに認証を要求しないでください。
引用する
https://www.freedesktop.org/software/systemd/man/systemd-ask-password.html https://www.freedesktop.org/software/systemd/man/machinectl.html