2

親戚のマシンで bash シェル スクリプトを実行する cronjob をインストールしようとしています。彼らはインストールを実行しますが、私はまだリモートでアクセスできません (それが私のスクリプトの目的ですが、ここでは問題ではありません)。kdialog を使用して root パスワードを要求し、それを使用してさまざまなコマンドを sudo したいと考えています。以下の私のコードは、a) ターミナルのルート p/w を明らかにし、b) さまざまな sudo へのパイプに失敗しているため、失敗しています。ヘルプ?

#!/bin/bash
kdialog --password "Please enter your root password to install theCronScript.sh and set up cron"

# Sanity checks =========================================╕
if test -z "$BASH" ; then
        printf "$SCRIPT:$LINENO: please run this script with the BASH shell\n">&2
        exit 192
fi
#========================================================╛

# Global variables=======================================╕
PW="$?"
THISDIR="$(pwd)"
GETIPFILE='theCronScript.sh'
CRONPERIOD='/15 *   *   *   *   '
TARGETCRONDIR='/etc/cron.hourly'
#========================================================╛
echo "hi"

# txt file exists check =================================╕
echo "Checking:"
if [ ! -f "$THISDIR/$GETIPFILE" ]; then #there's no file to install
  kdialog --msgbox "I cannot find $GETIPFILE to upload\nPlease check attachments in recent e-mails from Greg and download $GETIPFILE to $THISDIR"
  exit
else
  if [ -f "$TARGETCRONDIR/$GETIPFILE" ]; then #the target already exists
    kdialog --title "Replace or Keep" --warningyesno "A similar file already exists.\n Do you want to replace it (recommended)?\n(The original file will be saved with a different name _OLD)"
    if [ $? = 0 ]; then # rename, then replace the existing file
      #echo $PW is probably unneccessary beyond the first use but just in case...
      RNGETIPFILE=$GETIPFILE'_OLD'
      echo $PW | sudo -S mv $TARGETCRONDIR/$GETIPFILE $TARGETCRONDIR/$RNGETIPFILE #rename original file
      echo $PW | sudo -S cp $THISDIR/$GETIPFILE $TARGETCRONDIR/$GETIPFILE #copy new version in
      echo $PW | sudo -S chmod +x $TARGETCRONDIR/$GETIPFILE #
      echo $PW | sudo -S crontab -l > mycron #write out current crontab
      echo $PW | sudo -S echo $CRONPERIOD   $TARGETCRONDIR >> mycron #echo new cron into cron file
      echo $PW | sudo -S crontab mycron  #install new cron file
      rm mycron
      $PW="" #clear password variable once it's no longer required
    else # Don't replace, exit
      exit
    fi
  else # Nothing to replace. Just copy it in
      echo $PW | sudo -S "cp $THISDIR/$GETIPFILE $TARGETCRONDIR/$GETIPFILE" #copy new version in
      echo $PW | sudo -S chmod +x $TARGETCRONDIR/$GETIPFILE # make sure it's executable
      echo $PW | sudo -S crontab -l > mycron #write out current crontab
      echo $PW | sudo -S echo $CRONPERIOD   $TARGETCRONDIR >> mycron  #echo new cron into cron file
      echo $PW | sudo -S crontab mycron #install new cron file
      rm mycron
      $PW="" #clear password variable once it's no longer required
  fi
fi

exit 0
#========================================================╛
4

1 に答える 1

2

sudo1 つのオプションは、外部 GUI を介してコマンドで直接パスワードを要求することです。マンページからsudo

 -A, --askpass
             Normally, if sudo requires a password, it will read it from the user's terminal.  If the -A (askpass) option is specified, a (possibly graphical)
             helper program is executed to read the user's password and output the password to the standard output.  If the SUDO_ASKPASS environment variable is
             set, it specifies the path to the helper program.  Otherwise, if sudo.conf(5) contains a line specifying the askpass program, that value will be
             used.  For example:

                 # Path to askpass helper program
                 Path askpass /usr/X11R6/bin/ssh-askpass

             If no askpass program is available, sudo will exit with an error.

が認証情報をキャッシュしている場合sudo、このパスワードは 1 回だけ要求されます。これをキャッシュするために使用する1つの方法は、パスワードをキャッシュする以外に副作用がないことです。

export SUDO_ASKPASS=/usr/bin/ssh-askpass
sudo --askpass true

実行しているディストリビューションによっては、別の場所にssh-askpassある可能性があります。askpassのパスワードを取得するために使用する方法については、StackExchange にがあります。参考までに、スクリプトは次のとおりです。kdialogsudo

$ cat myaskpass.sh 
#!/bin/bash
kdialog --password "Please enter your password: "
exit 0

そして、あなたはそれをどのように使用しますか:

export SUDO_ASKPASS=/path/to/myaskpass.sh
sudo --askpass true
于 2014-11-25T15:07:42.920 に答える