'postgres'로 실행되는 'psql'에서 사용할 폴더의 안전한 임시 복사본을 만듭니다.

'postgres'로 실행되는 'psql'에서 사용할 폴더의 안전한 임시 복사본을 만듭니다.

주어진 상황을 처리하는 이상적인 방법을 찾는 문제입니다.

내 홈 폴더 아래의 폴더에는 다음과 같은 세트가 있습니다.SQL\include_relative메타 명령을 통해 서로 참조하는 스크립트 파일입니다. 때로는 이러한 스크립트를 실행해야 할 때도 있습니다.SQL데이터베이스 슈퍼유저로서. 왜냐하면포스트그레스이미 동료 검증이 완료되었으므로 전화해야 합니다.SQL그리고 sudo --user postgres. 하지만 이 파일들은 내 홈 폴더에 있기 때문에 OS 사용자들은포스트그레스접근할 수 없습니다. 이제 읽을 스크립트 파일이 하나만 있는 경우에는 표시된 대로 간단히 쉘 리디렉션을 사용할 수 있지만 다른 파일이 포함 sudo -u postgres psql < ~/psql/myscript.psql되면myscript.psqlSQL찾을 수 없습니다.

이 작업을 수행하는 간단하고 사소한 방법이 많이 있습니다. 그러나 스크립트를 실행해야 할 때마다 파일을 수동으로 복사/이동/삭제하는 것을 배제하고 콘텐츠를 손상시키지 않고 소스 폴더와 스크립트 파일을 자유롭게 이동하고 이름을 바꿀 수 있는 기능을 유지하고 싶습니다. 또한 이는 미션 크리티컬 프로덕션 서버이므로 PostgreSQL 서비스를 방해하는 것(예: 추가 슈퍼유저 생성 또는 인증 설정 변경과 같은 클러스터 구성 변경)이 불가능합니다. 이상적으로는 이것이 서버의 나머지 부분에 투명하기를 바랍니다. 여기에는 사전 구성된(예: ftab, systemd-mount) 바인드 마운트 및 재정의 또는 서버 구성에 대한 기타 변경 사항과 관련된 솔루션이 포함되지 않습니다.

특히 스크립트 폴더를 즉시 사용할 수 있게 만드는 명령을 찾고 있습니다.SQL, 스크립트가 실행되는 동안에만 유효합니다. 지금까지 내 솔루션은 다음과 같습니다.

$ sudo mount --bind -o ro,X-mount.mkdir=777 ./psql ~postgres/tmp && \
  sudo -iu postgres psql -f ~postgres/tmp/myscript.psql; \
  sudo umount ~postgres/tmp && \
  sudo rmdir ~postgres/tmp

하지만 여전히 장황하다고 생각하며 개선하기 위해 노력하고 있습니다. 그리고 나는 tmp그것을 좋아하지 않습니다 ~postgres. 누구든지 더 나은 아이디어가 있습니까?

편집하다:아래 @larsks의 의견을 바탕으로 위 솔루션에 여러 사용자가 액세스할 수 있는 시스템에 개인 정보 보호 결함이 있음을 깨달았습니다.포스트그레스사용자.

답변1

run-with-tempdir아래와 같이 쉘 스크립트를 작성합니다.

#!/bin/sh

tmpdir=$(mktemp -d ~postgres/tmp/psqlXXXXXX)
trap "rm -rf $tmpdir" EXIT

tar -C "$tmpdir" -xf- &&
  psql -f "$tmpdir/$1"

그런 다음 다음과 같이 실행합니다.

tar -C psql -cf- . | sudo -u postgres run-with-tempdir myscript.psql

(a) 홈 디렉터리를 postgres 사용자에게 노출하지 않습니다. (b) 시스템의 다른 사용자에게 스크립트를 노출하지 않습니다(tmpdir이 mode를 사용하여 생성되기 때문에 700). (c) 바인드 마운트가 필요하지 않습니다(이로 인해 발생할 수 있음). 오류로 인해 제거가 발생하지 않는 경우 문제가 발생함) 및 (d) 자체적으로 자동으로 정리됩니다.

관련 정보