ฉันจะระบุรหัสผ่านเป็น 'psql' แบบไม่โต้ตอบได้อย่างไร


337

ฉันพยายามที่จะทำให้กระบวนการสร้างฐานข้อมูลที่มีสคริปต์เชลล์และสิ่งหนึ่งที่ผมเคยตีบล็อกถนนที่มีการส่งผ่านรหัสผ่านเพื่อpsql นี่คือรหัสเล็กน้อยจากเชลล์สคริปต์:

psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"

ฉันจะส่งรหัสผ่านไปยังpsqlวิธีที่ไม่โต้ตอบได้อย่างไร


1
คุณสามารถใช้ URL การเชื่อมต่อ ตรวจสอบคำตอบนี้ได้ในstackoverflow.com/questions/3582552/postgres-connection-url
paulodiovani

คำตอบ:


141

จากเอกสารอย่างเป็นทางการ :

นอกจากนี้ยังสะดวกในการมีไฟล์ ~ / .pgpass เพื่อหลีกเลี่ยงการพิมพ์รหัสผ่านเป็นประจำ ดูมาตรา 30.13สำหรับข้อมูลเพิ่มเติม

...

ไฟล์นี้ควรมีบรรทัดของรูปแบบต่อไปนี้:

hostname:port:database:username:password

ฟิลด์รหัสผ่านจากบรรทัดแรกที่ตรงกับพารามิเตอร์การเชื่อมต่อปัจจุบันจะถูกใช้


29
ขอบคุณฉันรู้ pgpass แต่ไม่สามารถแก้ปัญหาได้ - ฉันต้องการสคริปต์ทุบตีในตัวเองเพื่อทำงานบนฐานข้อมูลดังนั้นคำถามของฉันเกี่ยวกับการส่งข้อมูลไปยัง psql ผ่านบรรทัดรับคำสั่ง
Alex N.

6
ฉันคิดว่าตัวเลือกเดียวของคุณคือการตั้งค่าไฟล์. RPG ที่สคริปต์ทุบตีของคุณสามารถเข้าถึงได้ หรือไม่ใช้รหัสผ่านเลย - คุณสามารถตั้งค่ารูปแบบการรับรองความถูกต้องรูปแบบอื่นเช่น ident หรือใช้ใบรับรอง SSL
ว่องไว

นั่นคือสิ่งที่ฉันกลัว :) ขอบคุณสำหรับข้อมูล!
อเล็กซ์เอ็น

ตัวเลือกอื่นอาจใช้คาดหวัง แต่ผมเกลียดคาดหวัง :)
Flimzy

1
อย่าลืมลบกลุ่มและสิทธิ์ผู้ใช้อื่น ๆ ในการอ่านเขียนดำเนินการไฟล์ .pgpass! Runchmod go-rwx .pgpass
Vladislavs Dovgalecs

611

ตั้งค่าตัวแปรสภาพแวดล้อม PGPASSWORD ภายในสคริปต์ก่อนเรียก psql

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

สำหรับการอ้างอิงดูที่http://www.postgresql.org/docs/current/static/libpq-envars.html


แก้ไข

ตั้งแต่ Postgres 9.2 นอกจากนี้ยังมีตัวเลือกในการระบุสตริงการเชื่อมต่อหรือ URIที่สามารถมีชื่อผู้ใช้และรหัสผ่าน

การใช้ที่มีความเสี่ยงด้านความปลอดภัยเนื่องจากรหัสผ่านจะปรากฏในข้อความธรรมดาเมื่อดูที่บรรทัดคำสั่งของกระบวนการทำงานเช่นการใช้ ps (Linux), ProcessExplorer (Windows) หรือเครื่องมือที่คล้ายกันโดยผู้ใช้รายอื่น

ดูคำถามนี้กับผู้ดูแลฐานข้อมูลด้วย


32
ตัวอย่างเช่นในหนึ่งบรรทัดคุณสามารถทำสิ่งที่ต้องการ: PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb

3
ฉันคิดว่านี่เป็นวิธีที่สะดวกที่สุดในการรันสคริปต์ SQL
zr870

2
ฉันสามารถเพิ่ม - เพิ่มspaceในบรรทัดคำสั่งก่อนที่อักขระตัวแรกและคำสั่งจะไม่ถูกเก็บไว้ในประวัติทุบตี ใช้งานได้กับ Ubuntu / bash
baldr

5
โบนัส: ใช้งานได้กับนักเทียบท่า:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil

3
ระวังและให้แน่ใจว่าได้เพิ่มช่องว่างก่อนหน้าเสมอมิฉะนั้นจะปรากฏในประวัติทุบตีของคุณ ~ /
.bash_history

102
  • ในหนึ่งบรรทัด:

    export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command'

    ด้วยคำสั่งคำสั่ง sql เช่น"select * from schema.table"

  • หรือมากกว่าอ่านได้:

    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")

18
บรรทัดเดียวสามารถทำให้ง่ายขึ้นเล็กน้อย: PGPASSWORD='password' psql .... ซึ่งยังมีประโยชน์ของตัวแปรที่ไม่สามารถเข้าถึงได้หลังจากคำสั่งเสร็จสิ้น
Garrett

3
export PGPASSWORD=YourNewPasswordทำงานให้ฉันมากกว่ารูปแบบอื่น ๆ
Mikeumus

7
export PGPASSWORDเสียงเหมือนความคิดที่ไม่ดีจริงๆ
Hasen

1
นี่จะบันทึกรหัสผ่านในประวัติ bash ของคุณ ~ / .bash_history ไฟล์ (เว้นแต่คุณจะเพิ่มพื้นที่ก่อนหน้าอย่างระมัดระวัง) และส่งออกรหัสผ่านไปยังสภาพแวดล้อมปัจจุบันของคุณ FWIW: |
rogerdpack

68

ฉันมักจะชอบส่งผ่าน URL ไปยังpsql :

psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME"

สิ่งนี้ให้อิสระแก่ฉันในการตั้งชื่อตัวแปรสภาพแวดล้อมตามที่ฉันต้องการและหลีกเลี่ยงการสร้างไฟล์ที่ไม่จำเป็น

libpqนี้ต้อง เอกสารที่สามารถพบได้ที่นี่


คุณสามารถใช้สิ่งนี้กับ pg_restore ได้ไหม? ขอบคุณ!
the_ccalderon

1
@ ccalderon911217 เห็นได้ชัดว่าคุณสามารถ: stackoverflow.com/a/28359470/1388292
Jacques Gaudin

@JacquesGaudin yep ทดสอบตัวเอง! ขอบคุณ!
the_ccalderon

26

บน Windows:

  1. กำหนดค่าให้กับ PGPASSWORD: C:\>set PGPASSWORD=pass

  2. เรียกใช้คำสั่ง: C:\>psql -d database -U user

พร้อมแล้ว

หรือในหนึ่งบรรทัด

set PGPASSWORD=pass&& psql -d database -U user

สังเกตการขาดพื้นที่ว่างก่อน &&!


1
ฉันลองมันและมันใช้งานไม่ได้ ยังคงถูกถามถึงรหัสผ่าน
antipattern

1
@antipattern คุณต้องผ่านตัวเลือก-wด้วย
mljrg

1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"โรงงาน
Steve Shipway

21

สิ่งนี้สามารถทำได้โดยการสร้าง.pgpassไฟล์ในโฮมไดเร็กทอรีของผู้ใช้ (Linux) .pgpass รูปแบบไฟล์:

<databaseip>:<port>:<databasename>:<dbusername>:<password>

คุณยังสามารถใช้ไวลด์การ์ด *แทนรายละเอียดได้

บอกว่าฉันต้องการที่จะทำงาน tmp.sqlโดยไม่ต้องใส่รหัสผ่าน

ด้วยรหัสต่อไปนี้คุณสามารถในไฟล์ * .sh

echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass
echo "` chmod 0600 $HOME/.pgpass `"

echo " ` psql -h 192.168.1.1 -p 5432  -U postgres  postgres  -f tmp.sql `        

11
จุดสะท้อนคืออะไร "chmod 0600 $ HOME / .pgpass` "? เพียงแค่ chmod 0600 $ HOME / .pgpass
Vlad Patryshev

12

ทางเลือกอื่นในการใช้PGPASSWORDตัวแปรสภาพแวดล้อมคือการใช้conninfoสตริงตามเอกสารประกอบ :

อีกวิธีหนึ่งในการระบุพารามิเตอร์การเชื่อมต่ออยู่ในสตริง conninfo หรือ URI ซึ่งใช้แทนชื่อฐานข้อมูล กลไกนี้ให้คุณควบคุมการเชื่อมต่อได้อย่างกว้างมาก

$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"

postgres=>

4

เพิ่มเนื้อหาของ pg_env.sh ไปยัง. bashrc ของฉัน:

cat /opt/PostgreSQL/10/pg_env.sh

#!/bin/sh
# The script sets environment variables helpful for PostgreSQL

export PATH=/opt/PostgreSQL/10/bin:$PATH
export PGDATA=/opt/PostgreSQL/10/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5433
export PGLOCALEDIR=/opt/PostgreSQL/10/share/locale
export MANPATH=$MANPATH:/opt/PostgreSQL/10/share/man

ด้วยนอกเหนือจาก (ตามข้อเสนอแนะของผู้ใช้ 4653174)

export PGPASSWORD='password'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.