2015年11月23日月曜日

Cygwinでsudoを使う

地味にハマったのでメモ。

AnsibleをCygWinで使っていた特に、何故かsudoが無いぞ。と怒られました。

そんな馬鹿なとリモートサーバを覗いてみるも、そもそもVagrant使っている段階でsudoないと使えないし。

っと小一時間プレイブックをこねくり回していたのですが、結果から言うとCygWinにsudoがないのが原因でした。
そもそもCygWinにパーミッションの概念がどこまであるのか疑問ですが、ググるとみんな苦労しているようで、解決法も様々あるようです。

自分が試したのは以下のサイトにあるやり方です。

Cygwin で sudo 的コマンドを使うための設定

/bin/sudoというファイルを作成し、以下の内容を張り付け、実行権限を付与します。


#!/bin/sh

function usage_exit() {
    cat << EOF >&2
Usage: $(basename $0) command
       $(basename $0) -e file
       $(basename $0) -v
EOF
    exit 1
}

edit_flg=0
while getopts :veh opt
do
    case $opt in
        v)
            exit 0
            ;;
        e)
            edit_flg=1
            ;;
        h)
            usage_exit
            ;;
        \?)
            usage_exit
            ;;
    esac
done

shift $(($OPTIND - 1))

if [ $edit_flg -eq 1 ]; then
    if [ $# -ne 1 ]; then
        usage_exit
    fi

    sudoedit "$1"
else
    if [ $# -eq 0 ]; then
        usage_exit
    fi

    quote_args=''

    for arg in "$@"
    do
        arg=$(printf '%q' "$arg")
        quote_args="$quote_args $arg"
    done
    quote_args=$(echo "$quote_args" | sed -e "s/\\\\'/'\"&\"'/g" -e 's/\\\\/&&/g')

    quote_pwd=$(printf '%q' "$PWD" | sed "s/\\\\'/'\"&\"'/g")

    cygstart --hide -w -a runas sh -l -c "'exec < /proc/$$/fd/0 > /proc/$$/fd/1 2> /proc/$$/fd/2; cd $quote_pwd; $quote_args'" &

    trap 'trap "" 1 2 3 15; sudo c:/Windows/system32/taskkill /pid $(ps -p $! | awk "NR==2 {print \$4}") /t > /dev/null 2>&1' 1 2 3 15
    wait $!
fi

1 件のコメント:

  1. Wikiページ公開しているものです。
    このblogを書かれた時に公開していたスクリプトはWindows10で
    動きませんでした。Wikiページの方は対策版を公開しております
    ので、そちらをご利用いただければと思います。
    よろしくお願いします。

    返信削除