SSH com su e comando remoto usando -c e executando vários comandos com parâmetros

1

Aqui está o meu comando com IP's comentados com o semanticIP's

ssh -p 2022 -L 9389:localRDPIP:3389 user@publicIP \
su -c "export HISTCONTROL=ignorespace; \
iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination localRDP_IP:3389; \
iptables -t nat -A POSTROUTING -p tcp -d localRDP_IP --dport 3389 -j SNAT --to-source jumpIP";

basicamente, estou tentando executar algum roteamento remoto, o que não é a questão. A questão é como eu executo tal comando?

O melhor teste que consegui fazer foi:

ssh -p 2022 -L 9389:localRDPIP:3389 user@publicIP -t "su -c nano; nano"

mas não sei como fazer os espaços. Se eu tiver espaços em meus comandos na área citada -c "diferente de um único comando, recebo um erro.

Nota : Eu percebo que com o encaminhamento de porta ssh, os comandos do iptables podem ser desnecessários.

    
por thistleknot 08.10.2017 / 16:41

2 respostas

1

Como mostrado na man page de su ( man su ), a opção -c recebe um único comando shell, passado para o seu shell atual para execução por seu comando -c :

-c, --command COMMAND Specify a command that will be invoked by the shell using its -c.

E, em seguida, de bash :

If the -c option is present, then commands are read from the first non-option argument _command_string_. If there are arguments after the _command_string_, the first argument is assigned to $0 and any remaining arguments are assigned to the positional parameters.

O resultado disso é que você não pode usar -c com vários comandos.

No entanto, não há nada que o impeça de fornecer um shell como o comando a ser executado por -c e usá-lo para manipular os vários comandos:

ssh -p 2022 -L 9389:localRDPIP:3389 user@publicIP su -c bash -c '
    export HISTCONTROL=ignorespace;
    iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination localRDP_IP:3389;
    iptables -t nat -A POSTROUTING -p tcp -d localRDP_IP --dport 3389 -j SNAT --to-source jumpIP
'

Não sei bem o que você quer alcançar com o seu segundo comando, no entanto. No momento, ele está configurado para executar nano como usuário root e, em seguida, para executá-lo novamente como sua própria conta. É isto o que você queria? Ou você queria executar nano duas vezes como usuário root, assim:

ssh -p 2022 -L 9389:localRDPIP:3389 user@publicIP -t su -c bash -c 'nano; nano'
    
por 08.10.2017 / 20:17
0

psql (e por extensão mysql) tinha uma limitação semelhante. Enquanto lia a documentação no psql, me deparei com isso

Comando

-c --command = comando Especifica que o psql deve executar uma cadeia de comandos, comando e, em seguida, sair. Isso é útil em scripts de shell. Arquivos de inicialização (psqlrc e ~ / .psqlrc) são ignorados com esta opção.

O comando

deve ser uma cadeia de comando totalmente analisável pelo servidor (ou seja, não contém recursos específicos do psql) ou um único comando de barra invertida. Assim, você não pode misturar meta-comandos SQL e psql com essa opção. Para conseguir isso, você poderia canalizar a string para o psql, por exemplo: echo '\ x \ SELECT * FROM foo;' | psql. (\ é o meta-comando do separador.)

Se a cadeia de comando contiver vários comandos SQL, eles serão processados em uma única transação, a menos que haja comandos BEGIN / COMMIT explícitos incluídos na cadeia para dividi-la em várias transações. Isso é diferente do comportamento quando a mesma string é alimentada na entrada padrão do psql. Além disso, apenas o resultado do último comando SQL é retornado.

Devido a esses comportamentos herdados, colocar mais de um comando na cadeia -c geralmente tem resultados inesperados. É melhor alimentar múltiplos comandos para a entrada padrão do psql, usando echo como ilustrado acima, ou via shell here-document, por exemplo:

psql <<EOF
\x
SELECT * FROM foo;
EOF

para o meu caso, eu simplesmente modifiquei minha declaração de eco

echo drop database if exists somedb; create database somedb;drop table if exists ur_table; CREATE TABLE ur_table (timestamp date, open real, high real,low real,close real,adjusted_close real,volume real,dividend_amount real,split_coefficient real,CONSTRAINT timestamp_pkey PRIMARY KEY (timestamp)); COPY ur_table(timestamp,open,high,low,close,adjusted_close,volume,dividend_amount,split_coefficient) FROM 'c:\test\temp.csv' DELIMITER ',' CSV HEADER;| psql -U postgres
    
por 17.07.2018 / 09:57

Tags