-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

su( man 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
'

하지만 두 번째 명령으로 무엇을 달성하고 싶은지 잘 모르겠습니다. 현재는 nano루트로 실행한 다음 다시 자신의 계정으로 실행하도록 설정되어 있습니다 . 이것이 당신이 원하는 것입니까? 또는 nano다음과 같이 루트로 두 번 실행하고 싶습니다 .

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

관련 정보