두 개의 명령을 실행해야 하는 별칭을 사용하려고 합니다. 여기서 첫 번째 명령은 일반 사용자 권한으로 실행할 수 있고 두 번째 명령에는 sudo 권한이 필요합니다.
alias hosts-get="scp [email protected]:/etc/hosts /tmp/ && sudo cat /tmp/hosts >> /etc/hosts"
사용 사례는 원격 서버의 호스트 파일을 가져와 내 컴퓨터의 호스트 파일에 추가하는 것입니다(원격 서버에는 클라이언트 시스템에 대한 모든 IP-도메인 정보가 포함되어 있습니다).
그러나 내가 얻은 별칭을 실행할 때 zsh: permission denied: /etc/hosts
sudo가 무시되거나 zsh가 그것을 해석할 수 없는 것처럼 보입니다.
검색 후 별칭을 다음과 같이 변경했습니다.
alias hosts-get="scp [email protected]:/etc/hosts /tmp/ && cat /tmp/hosts | sudo tee -a /etc/hosts"
이것은 잘 작동하는 것 같습니다. 누군가 이것에 대한 배경을 설명할 수 있습니까?
답변1
첫 번째 별칭의 sudo 명령은 루트 권한을 제공하지만 리디렉션은 사용자 권한을 사용하여 시도됩니다 cat /tmp/hosts
. 이는 일반적으로 충분히 높지 않기 때문에 "권한 거부" 오류가 발생합니다. >> /etc/hosts
이 기능을 달성하려면 다음과 같이 서브셸에서 명령을 실행할 수 있습니다.
alias hosts-get="scp [email protected]:/etc/hosts /tmp/ && sudo sh -c \"cat /tmp/hosts >> /etc/hosts\""
아니면 두 번째 방법을 따르세요.
여기에서는 "권한이 없는" cat 명령의 출력을 권한이 있는 "tee" 명령으로 리디렉션합니다. 그러면 /etc/hosts에 정보를 추가할 수 있는 권한이 있습니다.