web-dev-qa-db-ja.com

suの後にコマンドを実行するUbuntuスクリプト-ユーザー

Ubuntu 18.04.3 LTS(GNU/Linux 5.0.0-31-generic x86_64)

GNOMEシェル3.28.4

GNU bash、バージョン4.4.20(1)-release(x86_64-pc-linux-gnu)

通常、su - userがターミナルで呼び出され、ユーザーがさらにコマンドを入力しますが、私の場合、ユーザーにログインする必要があるスクリプトと書いています(username@pcname:~$すべての行の前、そのログインを呼び出すかどうかわからない)、次に通常入力されるコマンドを実行する

これらのコマンドはユーザーでSudo apt installされており、各行の先頭にusername@pcname:~$がない場合は機能しないため、これを行う必要があります。

-cフラグがあることを知っています。しかし、私が知る限り、-cフラグは、-su: MyCommand: command not foundを取得しているときにsuの下でコマンドを実行するだけです。

su - Username -c "some_commands;some_other_commands"

Su-ユーザーはこれを達成する正しい方法ですか? (username@pcname:~$)何が悪いのですか?

どんな助けでも大歓迎です:)

ちなみに、以前はこれを行うためのスクリプトの記述方法について尋ねていましたが、具体的で混乱しすぎているため、この問題に絞り込みます。

1
Kenivia

通常のユーザーデスクトップでSudoを必要とするスクリプトを実行する必要がある場合、次のようなエントリを作成します。

eyesome desktop entry.png

次に、パス内にラッパースクリプトを記述して、Sudoレベルに昇格させます。

$ cat /usr/local/bin/eyesome-cfg-desktop-wrapper.sh

#!/bin/bash

# NAME: eyesome-cfg-desktop-wrapper.sh
# PATH: /usr/local/bin
# DESC: Wrapper script to call `eyesome-cfg.sh`
# DATE: Sep 24, 2018. Modified June 6, 2019

# NOTE: Designed to be called from ~/Desktop/eyesome-cfg.desktop

# UPDT: 2019-06-06 Name change to reflect wrapper script.

PROGNAME="eyesome-cfg.sh"

tty -s;
if [[ "0" == "$?" ]]; then
    echo "$PROGNAME cannot be called from background process."
    exit 1
fi

if [[ $EUID != 0 ]]; then

    # Get Sudo password
    Password=$(zenity --password --title="Password for $PROGNAME")
    encryptPassword=$(echo -n "$Password" | md5sum)

    # After viewing encrypted password once, comment out line below.
    # echo "md5sum: $encryptPassword" 

    # Set value in quotes below to encryped password revealed above.
    if [[ "$encryptPassword" != "005e160c7bcfacf3d818d66e5856d75a  -" ]]; then
        echo "Invalid password!"
        exit 1
    fi

fi # non-terminals can't enter password.

# Call eyesome-cfg.sh with any parameters passed to this wrapper sript
if [[ $EUID == 0 ]]; then
    Sudo "$PROGNAME" "$@" # Already running as Sudo.
else
    echo $Password | Sudo -S "$PROGNAME" "$@"
fi

exit 0

スクリプトを初めて実行するときに、コメント(#)この行:

    # echo "md5sum: $encryptPassword" 

次に、スクリプトは暗号化されたパスワードを表示します。暗号化されたパスワードを取得して、下に数行入力します。

    if [[ "$encryptPassword" != "005e160c7bcfacf3d818d66e5856d75a  -" ]]; then

もちろん、これはすべてオプションであり、暗号化をスキップし、パスワードを通常のテキストでスクリプトにコード化して、だれでも読むことができます。しかし、私はそれをしません...

1