내가 사용한 스크립트에서기본이 함수는 모든 sudo 작업을 완료하기 위해 새로운 sudo-bash를 생성합니다.
#!/bin/bash
function sudo_stuffs() {
install_ss
}
function install_ss() {
echo something
}
main() {
# 切换目录
cd /tmp
if [[ ! -d "install_shadowsocks" ]]; then
mkdir install_shadowsocks
fi
cd install_shadowsocks
# 如果没有sudo权限
if ! sudo -v 1>/dev/null 2>&1 ; then
# 提示登录有权限的账户
echo "--- You don't have authority, login to the root or others in sudoers. ---"
exit 1
fi
export -f install_ss
FUNC=$(declare -f sudo_stuffs)
sudo bash -c "$FUNC; sudo_stuffs"
}
main "$@"
하지만 실제로는sudo_stuffs기능과 더 자세한 기능은 다음과 같습니다. 설치_SS기능.
나는 export -f install_ss
install_ss가 using이라는 하위 쉘에서 발견될 수 있는지도 확인했습니다 sudo bash -c "$FUNC; sudo_stuffs"
.
하지만 결과는 아직 나왔어
bash: 2행: install_ss: 명령을 찾을 수 없음
어떡해?
답변1
를 사용하지 마십시오 function
. 즉, 2-4행은 다음과 같습니다.
sudo_stuffs() {
install_ss
}
그런 다음 호출하려면 다음을 사용하십시오.
sudo_stuffs
마지막으로, 사용자가 루트가 아닐 때 루트 권한을 얻으려면 스크립트 시작 부분(1번째 줄 뒤)에 다음 3줄을 추가하세요. sudo
이는 사용자에게 실행 권한이 있는지 확인 sudo
하고 (보통) 비밀번호를 묻는 스크립트를 실행하여 수행됩니다 .
if [ `id -u` -gt 0 ]; then
exec sudo "$0" "$@"
fi
답변2
중복된 항목을 찾았지만 StackExchange의 규칙에 따라 설정할 수 없습니다.
그래서 여기에 게시합니다.
https://askubuntu.com/questions/57915/environment-variables-when-run-with-sudo
명령이 누락된 실제 이유는 명령이 셸에서 내보낸 환경 변수를 삭제하므로 sudo에 의해 생성된 하위 셸이 함수가 sudo
무엇인지 알 수 없기 때문입니다 .install_ss
답변3
귀하의 라인 sudo bash -c "$FUNC; sudo_stuffs" 나에게는 잘못된 것 같습니다. sudo -c 뒤에는 따옴표로 묶은 실행하려는 명령, 닫는 따옴표, 마지막에는 명령을 실행할 사용자 이름이 와야 합니다.
sudo -c "bash FUNC sudo_stuffs" MY_USERNAME
이런 식으로 함수를 호출하는 것이 가능한지 잘 모르겠습니다. 저는 보통 스크립트에서 함수를 호출하는데, 함수를 구성하는 명령이 특정 사용자로 실행되도록 하려면 함수에 suco -c "command" my_username 을 추가하면 됩니다.