Existe alguma maneira de executar dois comandos Db2 em uma linha de comando? (Eles serão chamados a partir de um exec
comando PHP .)
db2 connect to ttt
(observe que precisamos manter a conexão ativa para o segundo comandodb2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'
Eu tentei isso:
sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'
O primeiro comando termina corretamente, mas o segundo falha com a mensagem de erro SQL1024N A database connection does not exist. SQLSTATE=08003
Note que eu preciso executar isso como usuário php. O comando sudo -u db2inst1 id
como usuário php me fornece a saída correta.
Respostas:
O sudo pode executar vários comandos via shell, por exemplo:
Seu comando seria algo como:
Se a sua versão sudo não funcionar com ponto-e-vírgula com -s (aparentemente, não se for compilada com certas opções), você poderá usar
em vez disso, que basicamente faz a mesma coisa, mas faz você nomear o shell explicitamente.
fonte
sudo -s -- '/usr/bin/whoami; /usr/bin/whoami' /bin/bash: /usr/bin/whoami; /usr/bin/whoami: No such file or directory
sudo -- sh -c 'whoami; whoami;
como solução alternativa quando "sudo -s" estiver quebrado. Atualizei a resposta também.--
indica o final dos parâmetros parasudo
, então todo o resto faz parte do comando; sem ele, argumentos como-c
poderiam ser interpretados como argumentos parasudo
. Isso funciona para a maioria dos programas de linha de comando (mas não todos). Por outro (nãosudo
) exemplo, para remover um arquivo chamado-f
você não pode simplesmente correrrm -f
, certo ?! Mas você pode executarrm -- -f
para excluir o arquivo chamado-f
.Para seu comando, você também pode consultar o seguinte exemplo:
sudo sh -c 'whoami; whoami'
fonte
Eu costumo fazer:
fonte
Se você gostaria de lidar com aspas:
fonte
sudo
- você sempre precisa enganá-lo para executar um shell que possa aceitar vários comandos para executar como parâmetros"Uma alternativa
eval
para evitar o uso de um subshell:Nota: As outras respostas que usam
sudo -s
fail falham porque as aspas estão sendo passadas para o bash e executadas como um único comando, portanto, é necessário retirar as aspas com eval.eval
é melhor explicado é esta resposta SOCitar dentro dos comandos também é mais fácil:
E se os comandos precisarem parar de executar, se ocorrer uma falha, use duplo e comercial em vez de ponto e vírgula:
fonte
A
-s
opção não funcionou para mim,-i
funcionou.Aqui está um exemplo de como eu poderia atualizar o tamanho do log do meu bash:
fonte
No terminal, digite:
Em seguida, escreva quantos comandos quiser. Digite
exit
quando terminar.Se você precisar automatizá-lo, crie um
script.sh
arquivo e execute-o:fonte
Em um tópico um pouco relacionado, eu queria fazer o mesmo sudo com vários comandos via SSH, mas nenhuma das opções acima funcionou.
Por exemplo, no Ubuntu,
O truque descoberto aqui é aspas duplas no comando.
Outras opções que também funcionam:
Em princípio, as aspas duplas são necessárias porque acho que o shell do cliente em que o SSH é executado retira o conjunto de aspas mais externo. Misture e combine as aspas com as suas necessidades (por exemplo, variáveis precisam ser passadas). No entanto, YMMV com as aspas, especialmente se os comandos remotos forem complexos. Nesse caso, uma ferramenta como Ansible fará uma escolha melhor.
fonte
Se você conhece a senha root, pode tentar
fonte
sudo su -c "<command1> ; <command2>"
.As respostas acima não permitirão que você cite as aspas. Esta solução irá:
O comando umask e o comando mkdir são executados com o usuário 'nobody'.
fonte