How can I call psql so that it doesn't prompt for a password?
This is what I have:
psql -Umyuser < myscript.sql
However, I couldn't find the argument that passes the password, and so psql always prompts for it.
How can I call psql so that it doesn't prompt for a password?
This is what I have:
psql -Umyuser < myscript.sql
However, I couldn't find the argument that passes the password, and so psql always prompts for it.
You may wish to read a summary of the ways to authenticate to PostgreSQL.
To answer your question, there are several ways provide a password for password-based authentication:
Via the password prompt. Example:
psql -h uta.biocommons.org -U foo
Password for user foo:
In a pgpass file. See libpq-pgpass. Format:
<host>:<port>:<database>:<user>:<password>
With the PGPASSWORD environment variable. See libpq-envars. Example:
export PGPASSWORD=yourpass
psql ...
# Or in one line for this invocation only:
PGPASSWORD=yourpass psql ...
In the connection string The password and other options may be specified in the connection string/URI. See app-psql. Example:
psql postgresql://username:password@dbmaster:5433/mydb?sslmode=require
PGPASSWORD=yourpass psql ... doesn't seem to work with version 13 anymore (on Debian 10 in my case), therefore I successfully did with the connection string as explained in the official docspsql (PostgreSQL) 13.2 on a Mac.PGPASSWORD=[your password] psql -Umyuser < myscript.sql
You can add this command line at the beginning of your script:
export PGPASSWORD="[your password]"
export PGPASSWORD=[password] did work#!/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' EOFPGPASSWORD=password.This might be an old question, but there's an alternate method you can use that no one has mentioned. It's possible to specify the password directly in the connection URI. The documentation can be found here, alternatively here.
You can provide your username and password directly in the connection URI provided to psql:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
PGPASSWORDpsql.exe "postgresql://username:password@address:5432/database"If you intend on having multiple hosts/database connections, the ~/.pgpass file is the way to go.
Steps:
vim ~/.pgpass or similar. Input your information in the following format:
hostname:port:database:username:password Do not add string quotes around your field values. You can also use * as a wildcard for your port/database fields.chmod 0600 ~/.pgpass in order for it to not be silently ignored by psql.alias postygresy='psql --host hostname database_name -U username' The values should match those that you inputted to the ~/.pgpass file.. ~/.bashrc or similar. Note that if you have an export PGPASSWORD='' variable set, it will take precedence over the file.
An alternative to using PGPASSWORD environment variable is to use conninfo string according to the documentation
An alternative way to specify connection parameters is in a conninfo string or a URI, which is used instead of a database name. This mechanism give you very wide control over the connection.
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
You have to create a password file: see http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html for more info.
If you're having problems on windows like me (I'm using Windows 7 64-bit) and set PGPASSWORD=[Password] did not work.
Then, as Kavaklioglu said in one of the comments,
export PGPASSWORD=[password]
You will need to save this at the top of the file, or before any usage so its set before being called.
Certainly does work on windows :)
export PGPASSWORD=[password] does not work for me using the command line (cmd.exe) at all. Are you sure you weren't using cygwin or something similar?Given the security concerns about using the PGPASSWORD environment variable, I think the best overall solution is as follows:
There are a couple points of note here. Step 1 is there to avoid mucking with the user's ~/.pgpass file that might exist. You also must make sure that the file has permissions 0600 or less.
Some have suggested leveraging bash to shortcut this as follows:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
This uses the <() syntax to avoid needing to write the data to an actual file. But it doesn't work because psql checks what file is being used and will throw an error like this:
WARNING: password file "/dev/fd/63" is not a plain file
Building on mightybyte's answer for those who aren't comfortable with *nix shell scripting, here's a working script:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
The double dollar sign ($$) in /tmp/pgpasswd$$ at line 2 appends the process ID number to the file name, so that this script can be run more than once, even simultaneously, without side effects.
Note the use of the chmod command at line 4 - just like the "not a plain file" error that mightybyte described, there's also a "permissions" error if this is not done.
At line 7, you won't have to use the -hmyserver, the -pmyport, or -Ujdoe flag if you use the defaults (localhost : 5432) and only have one database user. For multiple users, (but the default connection) change that line to
psql mydb jdoe
Don't forget to make the script executable with
chmod +x runpsql(or whatever you called the script file)
UPDATE:
I took RichVel's advice and made the file unreadable before putting the password into it. That closes a slight security hole. Thanks!
mktemp to create a temporary file instead of coming up with your own naming scheme. It creates a new temp file (named something like /tmp/tmp.ITXUNYgiNh in Linux and /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4 on MacOS X) and prints its name to stdout.chmod 600 after creating the file, but before writing the password to it. As written, a malicious script on the server could continually try to read files of this format, and would sometimes succeed in getting the password. Also, if this script is interrupted for some reason, the file would be left on disk - writing a shell trap handler would address this. Given that it's not trivial to write a secure script like this, I recommend using export PGPASSWORD instead.PGPASSWORD has been deprecated in 9.3.You may find this useful: Windows PSQL command line: is there a way to allow for passwordless login?
8 years later...
On my mac, I had to put a line into the file
~/.pgpass like:
<IP>:<PORT>:<dbname>:<user>:<password>
Also see:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
u=rw for that file.On Windows worked the combination of url string and using psql options:
> psql -d postgresql://username:password@localhost:5432/mydb -f myscript.sql
passing the the command without -d was not working, just connected to the database, but no execution of the script