마치 수동으로 입력한 것처럼 인라인 SSH를 사용하여 명령을 실행하지만 로컬 컴퓨터에 직접 출력하려면 어떻게 해야 합니까?

마치 수동으로 입력한 것처럼 인라인 SSH를 사용하여 명령을 실행하지만 로컬 컴퓨터에 직접 출력하려면 어떻게 해야 합니까?

나는 완전히 제어할 수 없는 원격 서버에 액세스할 수 있으며 자동화 스크립트가 해당 서버에서 로컬로 작업을 실행하도록 하는 것을 선호합니다. SSH를 사용하여 인라인으로 실행되는 모든 명령이 동일하게 동작하는 것은 아니라는 것을 알았습니다. 크론 작업에서 실행되는 예:

ssh [email protected] "mysqldump -u dbuser -p'pass$word' dbname > backup.sql"

위의 내용(및 다양한 변형)은 를 반환합니다 mysqldump: Got error: 1045: Access denied for user 'dbuser'@'localhost' (using password: YES) when trying to connect. 그러나 ssh서버에서 비밀번호가 올바른지 확인한 다음 수동으로 실행 mysqldump -u dbuser -p'pass$word' dbname > backup.sql하면 모든 것이 잘 작동합니다.

또 다른 예는 다음과 같은 것을 실행하는 것입니다.

ssh [email protected] history > history.txt 

위의 출력은 비어 있지만 ssh다른 컴퓨터로 이동하여 수동으로 실행 하면 history > history.txt출력이 예상한 대로 나타납니다.

다음과 같은 작업을 수행하면 모든 것이 예상대로 작동합니다.

ssh [email protected] ls > ls.txt 

mysqldump설명된 로컬 파일을 생략하고 사용하여 -p'pass$word'예제를 해결할 수 있다는 것을 알고 있습니다..my.cnf여기. history전문적인 답변을 찾을 수 있습니다여기.

그러나 인라인으로 실행하고 출력을 로컬로 리디렉션할 때 따옴표로 묶더라도 여전히 예상대로 작동하지 않는 다른 명령이 발생합니다. 이는 마치 쉘이 액세스 방법에 따라 다른 변수가 추가된 무언가를 읽는 것과 같습니다.

마치 수동으로 입력한 것처럼 인라인 SSH를 사용하여 명령을 실행하지만 로컬 컴퓨터에 직접 출력하려면 어떻게 해야 합니까?

답변1

문제는 귀하의 견적입니다.

$ word='phrase'
$ echo "pass$word"
passphrase
$ echo "'pass$word'"
'passphrase'
$ echo "'pass\$word'"
'pass$word'

강한 따옴표는 약한 따옴표 안에 있는 변수를 "보호"하지 않습니다. 왜냐하면 마법의 속성을 잃게 되기 때문입니다.

간단한 해결책은 달러 기호를 피하는 것입니다. 이는 몰락할 수 있습니다.

$ ssh [email protected] "mysqldump -u dbuser -p'pass\$word' dbname > backup.sql"

또 다른 방법은 실제로 비밀번호를 변수에 넣는 것입니다.

$ password='pass$word' ssh [email protected] "mysqldump -u dbuser -p '$password' dbname > backup.sql"

셋째, 백업을 localhost로 전송하려면 SSH 터널을 사용하십시오.

$ ssh -L 3306:localhost:3306 sleep 60 &
$ mysqldump -u dbuser -p 'pass$word' -h localhost -P 3306 dbname > backup.sql

또한 귀하의 질문에는 출력을 로컬 컴퓨터로 리디렉션하는 것이 포함되어 있지만 명령은 그렇게 하지 않습니다.

$ ssh user@host "echo hello > output" # creates output on remote host
$ ssh user@host "echo hello" > output # creates output on local host

관련 정보