43 lines
978 B
Bash
Executable File
43 lines
978 B
Bash
Executable File
#!/bin/sh -eu
|
|
# flipbit - Toggle (flips) bit on file for owner only
|
|
|
|
if [ "${#}" -ne 2 ]; then
|
|
echo "Usage: ${0} [rwx] file"
|
|
exit 1
|
|
fi
|
|
|
|
mode="${1}"
|
|
file="${2}"
|
|
|
|
if [ ! -e "${file}" ]; then
|
|
echo "File not found"
|
|
exit 1
|
|
fi
|
|
|
|
# Get current permissions in octal format (3 digits: owner, group, other)
|
|
perms=$(stat -c "%a" "${file}")
|
|
|
|
# Extract owner permissions (first digit)
|
|
owner_perm=$(echo "${perms}" | cut -c1)
|
|
|
|
# Convert to decimal for bit manipulation
|
|
owner_dec=$((owner_perm))
|
|
|
|
# Toggle bits for owner only
|
|
for char in $(echo "${mode}" | sed 's/./& /g'); do
|
|
case ${char} in
|
|
r) owner_dec=$((owner_dec ^ 4)) ;;
|
|
w) owner_dec=$((owner_dec ^ 2)) ;;
|
|
x) owner_dec=$((owner_dec ^ 1)) ;;
|
|
esac
|
|
done
|
|
|
|
# Keep group and other permissions unchanged
|
|
group_perm=$(echo "${perms}" | cut -c2)
|
|
other_perm=$(echo "${perms}" | cut -c3)
|
|
|
|
# Construct new permissions
|
|
new_perms="${owner_dec}${group_perm}${other_perm}"
|
|
|
|
chmod "${new_perms}" "${file}"
|