TL; DR-昇格された特権でnemo/nautilusを実行すると、アクセス許可タブにユーザー/グループのTONが表示されます...それらはすべて、検索不可能なドロップダウンに詰まっていますホットキーのサポートはありません。アクセシビリティの悪夢なしに所有権をGUIから変更できるように、微調整/代替ファイルマネージャー/ chmod guiラッパーを探しています。提案はありますか?
VirtualboxにUbuntu 18.04のいくつかのバージョンがインストールされています。これまでは主に Cinnamon desktop /nemoを使用してきました。
主に、私はこのデスクトップに非常に満足しています。しかし、GUIベースの所有権の変更(ルートから)は、エントリのTONがドロップダウンに詰まっているため、検索できず、ホットキーを使用できないため(たとえば、 r 「ルート」などにジャンプします)。端末の起動は信頼できますが、急いでいるときは名前の入力に時間がかかります。
注:非rootアカウントからファイルマネージャを実行する場合、所有者は編集できず、いくつかのグループしか表示されないため、これは実際には問題ではありません。
私は通常、これに遭遇しました。現在のユーザーが所有していない共有フォルダーの誤った所有権パーマを修正しようとしています。また、通常、単一のchown -R
コマンドを実行するほど迅速かつ簡単ではありません。
私はこれと同じアクセシビリティ設計に遭遇しました:
以下の基準を満たすGUIベースのソリューションを見つけることに興味があります。
pkexec
など)。ルートで実行することを拒否する前に、私はいくつかのアプリに出くわしたので、これについてのみ言及します。この時点では、私が知らないオプションを誰かが知っていることを望んでいます...これがネモ固有のTweak、システム構成、あいまいなビルドオプション、別のファイルマネージャーであるかどうかは特に気にしません/ desktop環境、chown
の周りにGUIをラップするいくつかの外部アプリ(nemo-action
に投げてパスを渡すことができる限り)など。端末を起動して、急いでいるときに長い名前を手でタイプする方法。
*また、「ルートとして実行」/「昇格された権限で実行」と言っている場合、Sudo/pkexec /などで直接起動するのではなく、nemo/nautilus UIに表示されるオプションを意味します。
pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY nautilus
を実行して管理者権限で開きます。うまくいくものを見つけたらフォローアップしますが、これまでのところ、次のことを試しました。
pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY nautilus
は最終的には機能しました。当然のことながら、これにはネモと同じ問題があるようです。Sudo apt install -y eiciel
とtouch /tmp/foo.txt && eiciel /tmp/foo.txt
で試してみました...かなりかっこいいようですが、残念ながら、所有者の変更が許可されていないか、方法がわからないだけです(-add現在の所有者/グループを置き換えるのではなく、ユーザー/グループをACLに追加します)。Sudo thunar /
を使用して実行し、[権限]タブに移動すると、グループのドロップダウンにnemo/nautilusと同じ問題があり、rootとして実行しているにもかかわらず、ユーザーをまったく編集できませんでした。(admin/root/pkexec)nemoとnautilus>プロパティ>アクセス許可タブに表示される多数のエントリとホットキーサポートのない検索不可能なドロップダウン。
更新:他の応答を聞いたことはなく、これを更新して複数選択サポートを追加したので、これははるかにうまく機能しているので、他のオプションがないため、これを私の答えとして受け入れます
更新#2:私はそれ以来、面倒な作業をすべて行い、以下の手順を自動化するスクリプトを作成しました。スクリプトの詳細については、 my github を参照してください。
私はまだ他の回答に非常に興味がありますが、少なくともいくぶんハックな回避策(bash + yad + pkexec)を見つけました。プロジェクト、それでうまくいけば、それらの人の一人が私がここに持っているものよりも良いものを理解できるでしょう。
私の回避策は次のことを前提としています。
Sudo apt install -y yad
これには、3つのファイルを作成し、4番目のファイルを編集する必要があります(policykit定義用)。
1)最初に、一時フォルダと3つの一時ファイルを作成します。
mkdir /tmp/chown-gui
cd /tmp/chown-gui
# create temp files - we'll rename these later when they get moved
touch tmp-pkexec tmp-sh tmp-action
2)メインbashスクリプトを作成する
ファイル#1:tmp-sh(最終的に/ usr/bin/chown-gui-wrapperにあります)
#!/bin/bash
# v1.2.0
# Last updated on 2019 Oct 15
Prompt_on_multiple_files="true";
default_to_once_for_all_paths_if_no_Prompt="true";
apply_once_for_all_paths="false";
has_multiple_paths="false";
second_file="$2";
if [[ "" != "${second_file}" ]]; then
has_multiple_paths="true";
if [[ "true" == "${Prompt_on_multiple_files}" ]]; then
Prompt_response=$( yad --center --button="gtk-ok:0" --title "Multiple Paths Detected" --form --field="\n How would you like to apply permissions? \n:LBL" "" --field="${label_hpadding}:CB" "Set permissions once and apply it to all paths\!Set permissions for each path individually");
if [[ ! $Prompt_response =~ ^.*individually.*$ ]]; then
apply_once_for_all_paths="true";
fi
Elif [[ "true" == "${default_to_once_for_all_paths_if_no_Prompt}" ]]; then
apply_once_for_all_paths="true";
fi
fi
#echo "Prompt_on_multiple_files=\"${Prompt_on_multiple_files}\"";
#echo "default_to_once_for_all_paths_if_no_Prompt=\"${default_to_once_for_all_paths_if_no_Prompt}\"";
#echo "apply_once_for_all_paths=\"${apply_once_for_all_paths}\"";
popup_title="Please select the user and group owners";
popup_text="Please select the user and group owners for the following path:"
label_hpadding=" ";
for filepath in "${@}"; do
#echo "filepath in array is $filepath";
if [[ ! -e "${filepath}" ]]; then
ERROR_MSG="ERROR: File '${filepath}' does not exist";
notify-send --icon=error "${ERROR_MSG}";
echo "${ERROR_MSG}";
continue;
fi
filename=$(basename "${filepath}")
current_user=$(stat -c "%U" "${filepath}");
current_group=$(stat -c "%G" "${filepath}");
show_checkbox="false";
if [[ -d "${filepath}" ]]; then
show_checkbox="true";
fi
# get list of non-service accounts/groups
users_list=$(getent passwd {1000..60000}|awk -F: '{print $1}'|tr '\n' ' ');
groups_list=$(getent group {1000..60000}|awk -F: '{print $1}'|tr '\n' ' ');
sorted_user_list=$(echo $(printf '%s\n' root $users_list | sort -u)|sed -E "s/\\b($current_user)\\b/^\\1/g"|tr ' ' '\!');
sorted_group_list=$(echo $(printf '%s\n' root $groups_list | sort -u)|sed -E "s/\\b($current_group)\\b/^\\1/g"|tr ' ' '\!');
#echo "show_checkbox: ${show_checkbox}";
if [[ "true" == "${show_checkbox}" ]]; then
formdata=$(yad --center --button="gtk-cancel:1" --button="gtk-ok:0" --title "${popup_title}" --form --field="\n${label_hpadding}${popup_text}${label_hpadding}\n:LBL" "" --field="${label_hpadding}Path:${label_hpadding}:RO" "${filepath}" --field="${label_hpadding}User:${label_hpadding}:CBE" "${sorted_user_list}" --field="${label_hpadding}Group:${label_hpadding}:CBE" "${sorted_group_list}" --field "\n:LBL" "" --field="Apply Recursively?:CHK" "FALSE");
else
formdata=$(yad --center --button="gtk-cancel:1" --button="gtk-ok:0" --title "${popup_title}" --form --field="\n${label_hpadding}${popup_text}${label_hpadding}\n:LBL" "" --field="${label_hpadding}Path:${label_hpadding}:RO" "${filepath}" --field="${label_hpadding}User:${label_hpadding}:CBE" "${sorted_user_list}" --field="${label_hpadding}Group:${label_hpadding}:CBE" "${sorted_group_list}");
fi
if [[ "" == "$formdata" ]]; then
echo "user pressed cancel for filepath '${filepath}'";
continue;
fi
#echo "formdata=\"${formdata}\"";
new_user=$(echo "${formdata}"|awk -F'|' '{print $3}');
new_group=$(echo "${formdata}"|awk -F'|' '{print $4}');
is_recursive="FALSE";
if [[ "true" == "${show_checkbox}" ]]; then
is_recursive=$(echo "${formdata}"|awk -F'|' '{print $6}');
fi
#echo "new_user=\"${new_user}\"";
#echo "new_group=\"${new_group}\"";
#echo "is_recursive=\"${is_recursive}\"";
RECURSIVE_FLAG='';
if [[ "TRUE" == "${is_recursive}" ]]; then
RECURSIVE_FLAG='-R';
fi
if [[ "true" == "${has_multiple_paths}" && "true" == "${apply_once_for_all_paths}" ]]; then
chown $RECURSIVE_FLAG "${new_user}":"${new_group}" "${@}";
break;
else
chown $RECURSIVE_FLAG "${new_user}":"${new_group}" "${filepath}";
fi
done
3)ラッパースクリプトを作成する
ファイル#2:tmp-pkexec(最終的に/ usr/bin/pkexec-chown-gui-wrapperにあります)
#!/bin/bash
# v1.2.0
# Last Updated: 2019 Oct 15
yad_installed=$(which yad);
if [[ "" == "${yad_installed}" ]]; then
ERROR_MSG="ERROR: Missing dependency 'yad'; Please run: Sudo apt install -y yad;";
notify-send --icon=error "${ERROR_MSG}";
echo "${ERROR_MSG}";
exit;
fi
pkexec --user root env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY /usr/bin/chown-gui-wrapper "${@}"
4)nemoアクションを作成します(右クリックメニューに表示されます)。
ファイル#3:tmp-action(最終的に/usr/share/nemo/actions/change-owner.nemo_actionにあります)
[Nemo Action]
Name=Change Owner/Group
Comment=GUI wrapper for chown
Selection=s
Exec=/usr/bin/pkexec-chown-gui-wrapper %F
Icon-Name=gnome-settings
Extensions=any;
Quote=double
5)すべての一時ファイルを適切な場所にコピーし、権限を設定します
cd /tmp/chown-gui
Sudo cp tmp-sh /usr/bin/chown-gui-wrapper;
Sudo cp tmp-pkexec /usr/bin/pkexec-chown-gui-wrapper;
Sudo cp tmp-action /usr/share/nemo/actions/change-owner.nemo_action;
Sudo chown root:root /usr/bin/chown-gui-wrapper;
Sudo chown root:root /usr/bin/pkexec-chown-gui-wrapper;
Sudo chown root:root /usr/share/nemo/actions/change-owner.nemo_action;
Sudo chmod 755 /usr/bin/chown-gui-wrapper;
Sudo chmod 755 /usr/bin/pkexec-chown-gui-wrapper;
Sudo chmod 644 /usr/share/nemo/actions/change-owner.nemo_action;
# This part is needed if you want to be able to use this in nemo with
# single-file selections AND multiple-file selections BUT NOT when
# there is NO selection (e.g. directory background).
# Nemo's 'Selection' option doesn't currently allow multiple values
# and 'm' only considers "2+" and 'a' considers "0+"
# whereas this gives us "1,2+"
#
Sudo cp -a /usr/share/nemo/actions/change-owner.nemo_action /usr/share/nemo/actions/change-owner-single-file.nemo_action;
Sudo mv /usr/share/nemo/actions/change-owner.nemo_action /usr/share/nemo/actions/change-owner-multiple-files.nemo_action;
Sudo sed -i -E 's/^(Selection)=s/\1=m/' /usr/share/nemo/actions/change-owner-multiple-files.nemo_action;
6)yadがインストールされていることを確認します。これなしでは絶対に機能しません。あなたは潜在的にそれをzenityで置き換えることができます(しかしyadはzenityのフォークなので、それは私にはかなり無意味なようです)
Sudo apt install -y yad
7)ポリシーキットの例外を作成する
Pkexec.policyファイルがすでにある場合とない場合があります。その場合は、<action>...</action>
ブロック。ファイルがない場合は、作成します(chmod 664
およびchown root:root:
)全体をコピーします<policyconfig>...</policyconfig>
ブロック。
編集/作成するPolicykitファイル:/usr/share/polkit-1/actions/org.freedesktop.policykit.pkexec.policy
内容(新しいファイル):
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<action id="org.freedesktop.policykit.pkexec.run-chown-gui-wrapper">
<description>GUI wrapper for chown</description>
<message>Authentication is required to run chown-gui-wrapper</message>
<icon_name>gnome-settings</icon_name>
<defaults>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/bin/bash</annotate>
<annotate key="org.freedesktop.policykit.exec.argv1">/usr/bin/chown-gui-wrapper</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
</action>
</policyconfig>
8)設定を確認
# make dummy file to test with
echo dummy > /tmp/foo.txt
# check that you get the gui pop-up
# no need for root, just confirm gui comes up, then you can cancel
/usr/bin/chown-gui-wrapper /tmp/foo.txt
# check that you get the gui pop-up
# might Prompt for auth, just confirm gui comes up, then you can cancel
/usr/bin/pkexec-chown-gui-wrapper /tmp/foo.txt
端末から起動する場合は、nemoコンテキストメニューオプションが機能し、すべて正常であることを確認します。
yadで作成されたポップアップ
root +非サービスユーザー/グループに自動的にフィルタリングします。
注:ドロップダウンは実際にはA〜Zの降順で並べ替えられています。しかし、私は画像のユーザー名を編集しました...これはインターネットなので:-)