디렉터리를 '/home/corey/scripts'로 변경할 수 없습니다: 권한이 거부되었습니다.

디렉터리를 '/home/corey/scripts'로 변경할 수 없습니다: 권한이 거부되었습니다.

오류 메시지가 나타납니다...

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(권한이 없는 사용자가 파일을 읽을 수 있도록 허용하기 때문에 의도적인 것이라고 확신합니다).

내가 생각할 수 있는 다른 두 가지 솔루션이 있습니다.

  1. 명령에 추가하여 psql로그인 셸에서 실행-i

    sudo -i -u postgres psql < setup_dev_db.sql
    

    그러면 에 나열된 디렉토리 로 $HOME설정 됩니다 . Ubuntu의 경우 이는 입니다 . 그러나 명령을 입력하므로 파일이 생성되지 않습니다. 그러나 Interactive를 사용하는 경우 컴퓨터 권한이 있는 다른 사람은 누구나postgresHOME/etc/passwd/var/lib/postgres.psql_historypsqlsudo~ 할 것이다명령 기록에 액세스할 수 있습니다.

    이 상황에서 로그인 쉘을 실행하면 다른 부정적인 결과가 있는지 확실하지 않습니다.

  2. psql권한이 낮은 사용자로 실행합니다.

    $ psql dev_db -hlocalhost corey_dev -W < setup_dev_db.sql
    

    setup_dev_db.sqlPostgres 사용자 생성을 스크립트에 맡기고 아직 사용자가 없어서 이것이 문제가 되는 경우 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()(여기서 PGSYSCONFDIRPGLOCALEDIR).

이전 버전 솔루션:

16 이전 버전의 경우 명령이 실행되는 작업 디렉터리에 대한 명령 실행 권한을 사용자에게 부여하여 psql버그가 수정되었습니다 . x이 작업은 여러 가지 방법으로 수행할 수 있습니다.

  1. -i로그인 셸을 사용하는 명령을 추가하고 sudo명령을 실행하기 전에 작업 디렉터리를 postgres 사용자의 홈 디렉터리로 변경합니다 psql(postgres 사용자는 당연히 x자신의 홈 디렉터리에 대한 권한을 가집니다).

    sudo -i -u postgres psql < setup_dev_db.sql
    
  2. 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
    
  3. "다른" 작업 디렉터리에 대한 권한을 부여하여 x현재 작업 디렉터리에 대한 postgres 사용자 권한을 부여합니다. 이는 예를 들어 간단한 명령으로 오류를 수정할 수 있는 xWSL2와 같은 개발에 사용되는 단일 사용자 VM 기반 시스템에서 편리할 수 있습니다 .chmod o+x /home/$USER

  4. psql물론 현재 작업 디렉터리에 대한 권한이 있는 현재 사용자로 실행합니다 .

  5. 명령을 실행하기 전에 작업 디렉터리를 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

관련 정보