-cを使用したsuコマンドとリモートコマンドを使用したSSHと引数を持つ複数のコマンドの実行

-cを使用したsuコマンドとリモートコマンドを使用したSSHと引数を持つ複数のコマンドの実行

Semantic IPでコメントアウトされたIPのコマンドは次のとおりです。

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";

デフォルトではリモートルーティングを実行しようとしていますが、これは問題ではありません。問題は、そのようなコマンドを実行する方法です。

私ができる最高のテストは次のとおりです。

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

ところで空間をどのように作るのか分からない。-c単一のコマンドではなく、コマンドの「参照領域」にスペースがある場合、エラーが発生します。

ノート: SSH ポート転送を使用すると、iptables コマンドが不要になる可能性があることがわかります。

答え1

psql(および拡張してmysql)にも同様の制限があります。 psqlに関するドキュメントを読んでいる間、私はこれを見つけました。

-c command --command = commandはコマンド文字列、コマンドを実行してから終了するようにpsqlを指定します。これはシェルスクリプトで便利です。このオプションを使用すると、スタートアップファイル(psqlrcおよび〜/ .psqlrc)は無視されます。

コマンドは、サーバー上で完全に解析できるコマンド文字列(つまり、psql関連の機能がない)または単一のバックスラッシュコマンドでなければなりません。したがって、このオプションを使用してSQLおよびpsqlメタコマンドを混在させることはできません。たとえば、echo '\x\SELECT * FROM psql;' | (\ は区切り文字メタコマンドです.)

コマンド文字列に複数のSQLコマンドが含まれている場合、文字列にそれを複数のトランザクションに分割するための明示的なBEGIN / COMMITコマンドが含まれていない限り、単一のトランザクションで処理されます。これは、同じ文字列がpsqlの標準入力に提供されるときの動作とは異なります。また、最後のSQLコマンドの結果のみが返されます。

このような従来の動作により、-c 文字列に複数のコマンドを入力すると、予期しない結果が生じることがよくあります。上記のようにechoを使用するか、シェルhere-documentを介してpsqlの標準入力に複数のコマンドを提供することをお勧めします。たとえば、次のようになります。

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

私の場合は、ちょうどechoステートメントを修正しました。

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

答え2

suman su)のマニュアルページに示すように、この-cオプションは単一のシェルコマンドを使用し、その-cコマンドで実行するために現在のシェルに渡されます。

-c--command COMMANDシェルで使用することを指定します-c

COMMAND単一の引数でなければなりませんが、最新バージョンでは、次を呼び出すsuシェルで実行する複数のコマンドを参照するのを妨げることはありませんsu

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
'

しかし、2番目のコマンドで何を達成したいのかわかりません。現在はnanorootとして実行し、再び自分のアカウントで実行するように設定されています。これはあなたが望むものですか?または、nano次のようにrootとして2回実行したいと思います。

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

関連情報