无需postgres用户密码,通过SSH连接获取$PGDATA的方法求助
无需postgres密码,SSH获取$PGDATA的解决方案
没问题,这种情况太常见了——postgres作为系统服务用户,默认通常没有可登录的密码,甚至直接被禁用了密码登录。下面给你几个靠谱的方案,全程不用碰postgres的密码:
方案一:SSH密钥认证(推荐,长期可用)
这种方法是给postgres用户配置SSH公钥认证,之后你就能直接SSH登录postgres用户,或者用scp/rsync拉取数据,全程无密码。步骤如下:
本地生成SSH密钥对
在你自己的电脑上打开终端,执行:ssh-keygen -t ed25519全程按回车就行,不要设置密钥密码(这样后续操作完全无密码)。生成后,你的公钥会存在
~/.ssh/id_ed25519.pub里。用管理员账号上传公钥到服务器的postgres用户目录
先登录到服务器的管理员账号(比如你平时用的有sudo权限的账号):ssh your_admin_user@your_server_ip然后把本地的公钥传到服务器的临时目录,比如在本地终端执行(不用登录服务器):
scp ~/.ssh/id_ed25519.pub your_admin_user@your_server_ip:/tmp/回到服务器的管理员终端,切换到postgres用户并配置密钥:
sudo su - postgres # 创建.ssh目录(如果不存在) mkdir -p ~/.ssh && chmod 700 ~/.ssh # 创建并配置authorized_keys文件 touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys # 把公钥追加进去 cat /tmp/id_ed25519.pub >> ~/.ssh/authorized_keys测试连接并获取$PGDATA
现在你可以直接SSH登录postgres用户:ssh postgres@your_server_ip或者直接用scp拉取整个$PGDATA目录到本地:
scp -r postgres@your_server_ip:$PGDATA /your/local/target/path/
方案二:通过管理员账号sudo直接传输(临时用更快捷)
如果只是临时拉取一次数据,不想配置密钥,也可以用管理员账号配合sudo直接操作,全程不需要postgres的密码:
用tar+管道传输(压缩后传输,节省带宽)
在本地终端执行这条命令,直接把远程的$PGDATA打包后传到本地解压:
ssh your_admin_user@your_server_ip "sudo -u postgres tar -czf - -C \$(sudo -u postgres bash -c 'echo \$PGDATA') ." | tar -xzf - -C /your/local/target/path/
用rsync传输(增量同步,适合多次更新)
如果需要增量同步数据,用rsync更高效:
rsync -avz --rsync-path="sudo -u postgres rsync" your_admin_user@your_server_ip:$PGDATA/ /your/local/target/path/
注意事项
- 如果配置密钥后还是无法登录postgres用户,检查postgres用户的shell是否被限制:执行
sudo cat /etc/passwd | grep postgres,如果shell是/bin/false或/usr/sbin/nologin,可以临时改成/bin/bash:
要是只是传输文件,其实不需要交互式shell,scp/rsync依然可以正常工作。sudo usermod -s /bin/bash postgres - 确保你的管理员账号有sudo权限,并且sudo时不需要输入密码(如果需要的话,命令执行过程中会提示你输入管理员密码,这是正常的)。
内容的提问来源于stack exchange,提问作者Carlinto
相关产品推荐
相关产品推荐

