ฉันจะเรียกpsqlเพื่อที่จะไม่ให้ใส่รหัสผ่านได้อย่างไร
นี่คือสิ่งที่ฉันมี:
psql -Umyuser < myscript.sql
อย่างไรก็ตามฉันไม่สามารถหาข้อโต้แย้งที่ส่งผ่านรหัสผ่านได้ดังนั้น psql จะแจ้งให้เสมอ
ฉันจะเรียกpsqlเพื่อที่จะไม่ให้ใส่รหัสผ่านได้อย่างไร
นี่คือสิ่งที่ฉันมี:
psql -Umyuser < myscript.sql
อย่างไรก็ตามฉันไม่สามารถหาข้อโต้แย้งที่ส่งผ่านรหัสผ่านได้ดังนั้น psql จะแจ้งให้เสมอ
คำตอบ:
มีหลายวิธีในการตรวจสอบสิทธิ์กับ PostgreSQL คุณอาจต้องการที่จะตรวจสอบทางเลือกในการตรวจสอบรหัสผ่านที่https://www.postgresql.org/docs/current/static/client-authentication.html
เพื่อตอบคำถามของคุณมีวิธีการให้รหัสผ่านสำหรับการตรวจสอบตามรหัสผ่าน วิธีที่ชัดเจนคือผ่านทางพรอมต์รหัสผ่าน แทนที่จะเป็นเช่นนั้นคุณสามารถระบุรหัสผ่านในไฟล์ pgpass หรือผ่านPGPASSWORD
ตัวแปรสภาพแวดล้อม ดูเหล่านี้:
ไม่มีตัวเลือกในการให้รหัสผ่านเป็นอาร์กิวเมนต์บรรทัดคำสั่งเนื่องจากข้อมูลนั้นมักจะมีให้กับผู้ใช้ทั้งหมดและดังนั้นจึงไม่ปลอดภัย อย่างไรก็ตามในสภาพแวดล้อม Linux / Unix คุณสามารถระบุตัวแปรสภาพแวดล้อมสำหรับคำสั่งเดียวดังนี้:
PGPASSWORD=yourpass psql ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
คุณสามารถเพิ่มบรรทัดคำสั่งนี้ที่จุดเริ่มต้นของสคริปต์ของคุณ:
set PGPASSWORD=[your password]
export PGPASSWORD=[password]
ทำงานได้
#!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um << EOF DELETE FROM usrmgt.user_one_time_codes WHERE time < NOW() - INTERVAL '30 minute' EOF
PGPASSWORD=password
.
หากคุณต้องการเชื่อมต่อหลายโฮสต์ / ฐานข้อมูลไฟล์ ~ / .pgpassเป็นวิธีที่จะไป
ขั้นตอน:
vim ~/.pgpass
หรือคล้ายกัน ป้อนข้อมูลของคุณในรูปแบบต่อไปนี้:
hostname:port:database:username:password
อย่าเพิ่มอัญประกาศสตริงรอบค่าเขตข้อมูลของคุณ คุณยังสามารถใช้ * เป็นอักขระตัวแทนสำหรับเขตข้อมูลพอร์ต / ฐานข้อมูลของคุณchmod 0600 ~/.pgpass
เพื่อไม่ให้ถูกละเว้นโดย psqlalias postygresy='psql --host hostname database_name -U username'
ค่าควรตรงกับค่าที่คุณป้อนเข้ากับไฟล์ ~ / .pgpass. ~/.bashrc
หรือคล้ายกันโปรดทราบว่าถ้าคุณมีชุดตัวแปรส่งออก PGPASSWORD = '' มันจะมีความสำคัญมากกว่าไฟล์
chmod 600
ไฟล์มิฉะนั้นpsql
จะไม่สนใจไฟล์นั้น (อ้างอิงจากเอกสาร)
นี่อาจเป็นคำถามเก่า แต่มีวิธีอื่นที่คุณสามารถใช้ที่ไม่มีใครพูดถึง เป็นไปได้ที่จะระบุรหัสผ่านโดยตรงใน URI การเชื่อมต่อ เอกสารที่สามารถพบได้ที่นี่ผลัดที่นี่
คุณสามารถระบุชื่อผู้ใช้และรหัสผ่านของคุณโดยตรงใน URI การเชื่อมต่อที่ให้ไว้กับpsql
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
PGPASSWORD
หากคุณมีปัญหาบน windows เช่นฉัน (ฉันใช้ Windows 7 64 บิต) และset PGPASSWORD=[Password]
ไม่ทำงาน
จากนั้นดังที่ Kavaklioglu พูดในความคิดเห็นอย่างใดอย่างหนึ่ง
export PGPASSWORD=[password]
คุณจะต้องบันทึกสิ่งนี้ไว้ที่ด้านบนของไฟล์หรือก่อนการใช้งานใด ๆ ดังนั้นจึงตั้งค่าก่อนที่จะถูกเรียก
ทำงานบน windows ได้แน่นอน :)
export PGPASSWORD=[password]
ไม่ทำงานสำหรับฉันโดยใช้บรรทัดคำสั่ง (cmd.exe) เลย คุณแน่ใจหรือว่าไม่ได้ใช้ cygwin หรืออะไรทำนองนี้?
คุณต้องสร้างไฟล์รหัสผ่าน: ดูhttp://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.htmlสำหรับข้อมูลเพิ่มเติม
จากความกังวลด้านความปลอดภัยเกี่ยวกับการใช้ตัวแปรสภาพแวดล้อม PGPASSWORD ฉันคิดว่าโซลูชันโดยรวมที่ดีที่สุดมีดังนี้:
มีโน้ตอยู่สองสามจุดที่นี่ ขั้นตอนที่ 1 มีไว้เพื่อหลีกเลี่ยงการลอกคราบด้วยไฟล์ ~ / .pgpass ของผู้ใช้ที่อาจมีอยู่ คุณต้องตรวจสอบให้แน่ใจว่าไฟล์มีสิทธิ์ 0600 หรือน้อยกว่า
บางคนแนะนำให้ใช้ประโยชน์จากการทุบตีเพื่อทางลัดดังนี้:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
นี่ใช้ไวยากรณ์ <() เพื่อหลีกเลี่ยงการต้องเขียนข้อมูลลงในไฟล์จริง แต่มันไม่ทำงานเพราะ psql ตรวจสอบไฟล์ที่ใช้อยู่และจะเกิดข้อผิดพลาดเช่นนี้:
WARNING: password file "/dev/fd/63" is not a plain file
สามารถทำได้ง่ายๆโดยใช้ PGPASSWORD ฉันใช้ psql 9.5.10 ในกรณีของคุณการแก้ปัญหาจะเป็น
PGPASSWORD=password psql -U myuser < myscript.sql
สร้างจากคำตอบอันยิ่งใหญ่ของผู้ที่ไม่พอใจกับการเขียนสคริปต์* nix shell นี่เป็นสคริปต์ที่ใช้งานได้:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
เครื่องหมายดอลลาร์สองตัว ( $$
) ใน/tmp/pgpasswd$$
บรรทัด 2 ต่อท้ายหมายเลข ID กระบวนการต่อท้ายชื่อไฟล์เพื่อให้สคริปต์นี้สามารถทำงานได้มากกว่าหนึ่งครั้งแม้ในเวลาเดียวกันโดยไม่มีผลข้างเคียง
สังเกตการใช้chmod
คำสั่งที่บรรทัด 4 - เช่นเดียวกับข้อผิดพลาด" ไม่ใช่ไฟล์ธรรมดา " ที่อาจอธิบายได้โดยมีข้อผิดพลาด " สิทธิ์ " หากยังไม่เสร็จ
ที่บรรทัดที่ 7 คุณจะไม่ต้องใช้-h
myserver , -p
myportหรือ-U
jdoe flag หากคุณใช้ค่าเริ่มต้น ( localhost : 5432 ) และมีผู้ใช้ฐานข้อมูลเพียงคนเดียว สำหรับผู้ใช้หลายคน (แต่การเชื่อมต่อเริ่มต้น) เปลี่ยนบรรทัดนั้นเป็น
psql mydb jdoe
อย่าลืมที่จะทำให้สคริปต์ใช้งานได้ด้วย
chmod +x runpsql
( หรือสิ่งที่คุณเรียกว่าไฟล์สคริปต์ )
UPDATE:
ฉันใช้คำแนะนำของRichVelและทำให้ไฟล์อ่านไม่ได้ก่อนที่จะใส่รหัสผ่านลงไป ที่ปิดรูโหว่เล็กน้อย ขอบคุณ!
mktemp
เพื่อสร้างไฟล์ชั่วคราวแทนที่จะมากับรูปแบบการตั้งชื่อของคุณเอง มันสร้างไฟล์ temp ใหม่ (ตั้งชื่อบางอย่างเช่น/tmp/tmp.ITXUNYgiNh
ใน Linux และ/var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
บน MacOS X) และพิมพ์ชื่อเป็น stdout
chmod 600
หลังจากสร้างไฟล์ แต่ก่อนที่จะเขียนรหัสผ่านลงไป ตามที่เขียนไว้สคริปต์ที่เป็นอันตรายบนเซิร์ฟเวอร์อาจพยายามอ่านไฟล์ในรูปแบบนี้อย่างต่อเนื่องและบางครั้งอาจประสบความสำเร็จในการรับรหัสผ่าน นอกจากนี้หากสคริปต์นี้ถูกขัดจังหวะด้วยเหตุผลบางอย่างไฟล์จะถูกทิ้งไว้บนดิสก์ - การเขียนเชลล์trap
ตัวจัดการจะแก้ปัญหานี้ เนื่องจากมันไม่สำคัญที่จะเขียนสคริปต์ที่ปลอดภัยเช่นนี้ฉันแนะนำให้ใช้export PGPASSWORD
แทน
PGPASSWORD
เลิกใช้แล้วใน 9.3
อีกทางเลือกหนึ่งในการใช้PGPASSWORD
ตัวแปรสภาพแวดล้อมคือการใช้conninfo
สตริงตามเอกสารประกอบ
อีกวิธีหนึ่งในการระบุพารามิเตอร์การเชื่อมต่ออยู่ในสตริง conninfo หรือ URI ซึ่งใช้แทนชื่อฐานข้อมูล กลไกนี้ให้คุณควบคุมการเชื่อมต่อได้อย่างกว้างมาก
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
คุณอาจพบว่ามีประโยชน์: บรรทัดคำสั่งของ Windows PSQL: มีวิธีอนุญาตให้ลงชื่อเข้าใช้แบบไม่มีรหัสผ่านหรือไม่
8 ปีต่อมา ...
สำหรับ mac ของฉันฉันต้องใส่บรรทัดลงในไฟล์
~/.pgpass
เช่น:
<IP>:<PORT>:<dbname>:<user>:<password>
ดูเพิ่มเติมที่:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
ฉันพบว่า psql แสดงพรอมต์รหัสผ่านแม้ว่าคุณจะกำหนดตัวแปร PGPASSWORD แต่คุณสามารถระบุตัวเลือก -w สำหรับ psql เพื่อไม่ให้ใส่รหัสผ่านได้
ใช้ -w ในคำสั่ง: psql -h localhost -p 5432 -U user -w