Executando vários comandos com su no Bash

10

Eu gostaria de usar su -cpara executar como root vários comandos por completo. Eu não quero usar um script extra para isso.

Eu tentei o seguinte:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & " -c "ls -lh"

mas executa apenas o lsnão o primeiro.

Eu tentei o seguinte:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

mas diz que há um erro com o ponto e vírgula ;.

voce sabe como fazer isso?

Abruzzo Forte e Gentio
fonte

Respostas:

14

Este comando funciona bem:

su root -c "date; ls -lh"

Mas neste comando:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

Desde que você tem &antes, ;portanto, você está recebendo erros. Tente remover &e reexecutar o comando.

Ou você pode executar seu comando assim:

su root -c "(tcpdump -i wlan0 -s 1500 -w CCCCCC &); ls -lh"
anubhava
fonte
Claro, não há nenhuma razão para adicionar parênteses a menos que o OP realmente realmente realmente quer escrever um ;entre o tcpdumpe lscomandos - apenas deixar de fora os pontos e vírgulas e ele vai trabalhar.
G-Man diz 'Reinstate Monica'
2

Como anubhava diz , seu

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

O comando está falhando porque você não tem permissão para &segui-lo imediatamente ;. Você pode ver isso digitando os comandos diretamente no shell:

  • true & true  trabalho
  • true & ; true não funciona

Se você deseja que o tcpdumpcomando seja executado em segundo plano, remova o ;, como em

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ls -lh;"

(e você também não precisa do ;final, mas não dói).

G-Man diz que 'restabelece Monica'
fonte
1

Eu acho que o nohupcomando também lhe dará o que você deseja ... tcpdump em execução em segundo plano (não é necessário comercial):

su root -c "nohup tcpdump -i wlan0 -s 1500 -w CCCCCC ; ls -lh"

fonte
Oi eu acho que sim. O NOHUP deixa os comandos em execução em segundo plano, mesmo quando um usuário é desconectado. Eu não lembrava disso. Muito obrigado.
(1) É bom usar nohupquando você executa comandos em segundo plano, mas isso realmente não tem nada a ver com esta pergunta. (2) Esta resposta está errada - nohuppor si só não faz com que um comando seja executado em segundo plano; você ainda precisa digitar &(o que nos deixa de volta onde começamos, com um erro de sintaxe no comando).
G-Man diz 'Reinstate Monica'
0

Apenas para acrescentar à excelente resposta de Anubhava :

Você poderia usar {}também, assim:

su root -c "{ tcpdump -i wlan0 -s 1500 -w CCCCCC & }; ls -lh"

{}é um pouco mais eficiente do ()que não cria um sub shell. {}precisa de um espaço depois {e um ;antes, a }menos que &já tenhamos um .

codeforester
fonte
Claro, não há nenhuma razão para adicionar chaves ou parênteses a menos que o usuário realmente realmente realmente quer escrever um ;entre o tcpdumpe lscomandos - apenas deixar de fora o ponto e vírgula e ele vai trabalhar.
G-Man diz 'Reinstate Monica'
-1

Use &&para separar seus comandos da seguinte maneira:

$ su -c "ls && ls"

fonte
Auch ... esse é o meu erro. Eu queria executar o processo em segundo plano, mas não sabia disso && para separar comandos. Thx
3
&& significa "Execute o segundo comando apenas se o primeiro tiver êxito". Se o seu primeiro comando errar, o segundo não será executado. Isso geralmente é bom, mas eu hesitaria em descrever o && como puramente um separador.
Leo
E, se você deseja executar o tcpdumpprocesso em segundo plano, &&não adianta nada.
G-Man diz 'Reinstate Monica'