Qual é a diferença entre sudo su - postgres e sudo -u postgres?

36

Os usuários do PostgreSQL usam autenticação por pares em soquetes unix por padrão, onde o usuário unix deve ser o mesmo que o usuário do PostgreSQL. Então, as pessoas freqüentemente usam suou sudose tornam o postgressuperusuário.

Costumo ver pessoas usando construções como:

sudo su - postgres

ao invés de

sudo -u postgres -i

e eu estou me perguntando o porquê. Da mesma forma, eu já vi:

sudo su - postgres -c psql

ao invés de

sudo -u postgres psql

Sem a liderança, sudoas suversões fariam algum sentido se você estivesse em uma plataforma antiga sudo. Mas por que você usaria um UNIX ou Linux não pré-hísmico sudo su?

Craig Ringer
fonte
Relacionado no site irmão, DBA Stack Exchange: Mude o usuário para o usuário 'postgres' no macOS resulta no erro "su: Sorry"
Basil Bourque 26/18

Respostas:

40

Esqueço sudo su

Não há benefício em usar sudo su, é um hábito anacrônico de quando as pessoas estavam acostumadas a usar su. As pessoas começaram a atacar sudoquando as distros do Linux pararam de definir uma senha root e fizeram sudoo único caminho para acessar a conta root. Em vez de mudar seus hábitos, eles apenas usavam sudo su. (Eu era um deles até relativamente recentemente, ao usar caixas com sudoersconfigurações, me forçou a mudar meu hábito).

Usar sudo -u

Para um shell de login, sudo -u postgres -ié preferível sudo su - postgres. Não requer que o usuário tenha acesso root /etc/sudoers, ele precisa apenas do direito de se tornar usuário postgres. Também permite impor melhores controles de acesso.

Para execução de comando

sudo -u postgres psql -c "SELECT 1"

é superior à alternativa:

sudo su - postgres -c "psql -c \"SELECT 1\""

porque você não precisa fazer aspas duplas e outros metacaracteres do shell, além das outras vantagens de segurança de não precisar de root. Você provavelmente acidentalmente começará a escrever:

sudo su - postgres -c psql -c "SELECT 1"

às vezes, o que não funciona corretamente.

Finalmente, é muito mais fácil definir variáveis ​​de ambiente via sudo, por exemplo,

sudo PATH=/usr/pgsql-9.3/bin:$PATH -u postgres /usr/pgsql-9.3/bin/initdb -D /var/lib/pgsql/testcluster

do que via su. (Aqui, a PATHconfiguração é necessária para initdbencontrar o postgresexecutável correto ).

Tão. Esqueça o sucomando existe. Você não precisa mais disso. Para quebrar o hábito, alias-lo para algo que irá imprimir um erro. (Alguns scripts de configuração do init e do pacote ainda são usados, suportanto você não pode removê-lo).

Veja também:

Craig Ringer
fonte