오류 메시지가 나타납니다...
could not change directory to "/home/corey/scripts": Permission denied
...다음 스크립트를 실행하면...
#!/bin/bash
sudo -u postgres psql < setup_dev_db.sql
read -rsp $'Press any key to continue...\n' -n 1 key
... setup_dev_db.sql의 내용은 문제 없이 실행되지만 오류가 발생하여 짜증스럽습니다.
나는 그것을 제거할 수 있습니까?
답변1
Postgres는 클라이언트의 모든 쿼리와 명령이 저장되는 $HOME/.psql_history
파일을 생성하려고 합니다 . psql
뭔가 다른 작업을 하려는 것일 가능성이 높지만 $HOME
, 다른 숨겨진 파일 형태에서는 그 어떤 증거도 보이지 않습니다. 대화형으로 사용하지 않으면 실제로 히스토리 파일을 생성하지 않지만 실제로 psql
는 그렇지 않습니다.
나는 똑같은 문제가 있었고 이것을 발견했지만 허용된 대답은 나에게 받아들일 수 없었습니다. 스크립트에서 실행하는 디렉터리에 쿼리 추적을 남기도록 postgres 권한을 부여해서는 안 됩니다!
@Corey, 귀하의 의견에서 언급한 솔루션( cd /tmp
전화하기 전 sudo...
)이 아마도 최고일 것입니다. psql
이 파일은 생성되지 않았습니다 /tmp
(권한이 없는 사용자가 파일을 읽을 수 있도록 허용하기 때문에 의도적인 것이라고 확신합니다).
내가 생각할 수 있는 다른 두 가지 솔루션이 있습니다.
명령에 추가하여
psql
로그인 셸에서 실행-i
sudo -i -u postgres psql < setup_dev_db.sql
그러면 에 나열된 디렉토리 로
$HOME
설정 됩니다 . Ubuntu의 경우 이는 입니다 . 그러나 명령을 입력하므로 파일이 생성되지 않습니다. 그러나 Interactive를 사용하는 경우 컴퓨터 권한이 있는 다른 사람은 누구나postgres
HOME
/etc/passwd
/var/lib/postgres
.psql_history
psql
sudo
~ 할 것이다명령 기록에 액세스할 수 있습니다.이 상황에서 로그인 쉘을 실행하면 다른 부정적인 결과가 있는지 확실하지 않습니다.
psql
권한이 낮은 사용자로 실행합니다.$ psql dev_db -hlocalhost corey_dev -W < setup_dev_db.sql
setup_dev_db.sql
Postgres 사용자 생성을 스크립트에 맡기고 아직 사용자가 없어서 이것이 문제가 되는 경우createuser
먼저 다음과 같이 스크립트에 명령을 추가하기만 하면 됩니다.$ sudo -u postgres createuser corey_dev -P
아마도...
$ sudo -u postgres createdb dev_db "Dev database"
참고: psql
클라이언트를 대화형으로 사용하는 경우could not change directory to "/home/corey/scripts": Permission denied
(여기는 당신이 아닙니다), message****와 같은 메시지가 표시되면 ,psql
예/var/lib/postgres/.psql_history
(또는 어디에 있든 ) 편지를 쓸 것 $HOME
입니다! 대화형을 사용하는 동안 이 경고를 본 경우 psql
자세히 살펴보세요. 숨겨진 기록 파일을 찾을 수 있습니다.
답변2
디렉터리를 변경하려면 사용자에게 디렉터리에 대한 "x" 권한이 있어야 합니다.
나는 당신이 "/home/corey/scripts"에서 스크립트를 실행하고 있다고 가정합니다. "sudo -u postgres"가 현재 사용자를 "postgres"로 변경하면 "postgres"의 작업 디렉터리를 표시된 오류가 생성될 때 호출된 디렉터리로 설정하려고 시도합니다.
사용자 "postgres"가 "/home/corey/scripts"에 대한 "x" 권한을 가지고 있는지 확인하십시오.
답변3
긴 이야기 짧게: 가지다이 문제에 대한 토론Postgres 메일링 리스트에서PostgreSQL 16에서 수정됨.
잘못된 이유:
하지만@lambart의 솔루션맞습니다. 오류가 발생한 이유는 파일과 관련이 없기 때문이 아닙니다 .psql_history
. 이것
could not change directory to "/home/corey/scripts": Permission denied
오류는 다음에서 발생합니다.resolve_symlinks()
기능심볼릭 링크를 확인 chdir
하고 결국 원래 디렉터리로 돌아가려고 시도합니다 . 실행하는 사용자에게 해당 권한이 없으면 chdir
실패합니다 . psql
호출 resolve_symlinks()
은 에서 오고 find_my_exec()
, 이 호출은 에서 호출됩니다.set_pglocale_pgservice()
(여기서 PGSYSCONFDIR
및 PGLOCALEDIR
).
이전 버전 솔루션:
16 이전 버전의 경우 명령이 실행되는 작업 디렉터리에 대한 명령 실행 권한을 사용자에게 부여하여 psql
버그가 수정되었습니다 . x
이 작업은 여러 가지 방법으로 수행할 수 있습니다.
-i
로그인 셸을 사용하는 명령을 추가하고sudo
명령을 실행하기 전에 작업 디렉터리를 postgres 사용자의 홈 디렉터리로 변경합니다psql
(postgres 사용자는 당연히x
자신의 홈 디렉터리에 대한 권한을 가집니다).sudo -i -u postgres psql < setup_dev_db.sql
x
작업 디렉터리를 소유한 그룹에 postgres 사용자를 추가하여 현재 작업 디렉터리에 대한 postgres 사용자 권한을 부여합니다.# Get group owning the current directory stat -c "%G" . # Add postgres user to that group sudo usermod -aG <group above here> postgres
"다른" 작업 디렉터리에 대한 권한을 부여하여
x
현재 작업 디렉터리에 대한 postgres 사용자 권한을 부여합니다. 이는 예를 들어 간단한 명령으로 오류를 수정할 수 있는x
WSL2와 같은 개발에 사용되는 단일 사용자 VM 기반 시스템에서 편리할 수 있습니다 .chmod o+x /home/$USER
psql
물론 현재 작업 디렉터리에 대한 권한이 있는 현재 사용자로 실행합니다 .명령을 실행하기 전에 작업 디렉터리를 postgres 사용자에게 권한 이 있는 디렉터리로 변경합니다
x
.cd /tmp
답변4
이것은 나에게 효과적이었습니다. 따옴표(')에 주목하세요.
sudo -Hiu postgres 'pg_dump --column-inserts --data-only --table=someTable entities_db > /var/backups/anywhere/$(date +%Y%m%d_%H%M%S)_someTable.sql'
sudo에 대한 참고 사항 -Hiu
또는 사용su - postgres
루트 cronjob에 넣을 수도 있습니다.crontab -e