내 로컬 컴퓨터에서 원격 SSH 서버로 문자열을 보내겠습니다.
사용자는 단순 감옥에 있으므로 명령을 실행하거나 로그인하거나 원격 bash에서 작업을 수행하거나 다른 작업을 수행할 수 없으며 문자열/값/변수를 보내고 run
ssh 서버에서 스크립트를 실행할 수만 있습니다.
이것은 사용자를 위한 간단한 감옥입니다.
이는 사용자가 로그인하고 셸을 실행하기 위한 기본 설정입니다.
chsh -s /bin/bash [USER]
하지만 단순 감옥의 설정을 다음과 같이 변경했습니다.
chsh -s /home/[USER]/./run [USER]
SSH 서버는 문자열을 수신하고 해당 문자열을 새 결과로 변경합니다.
이 새로운 결과를 내 로컬 컴퓨터에 OUTPUT
.
시도한 끝에 이 해결책을 찾았습니다. 해킹 또는 버그라고 부르지만 이것이 올바른 방법인지 모르겠습니다!
- 이 명령을 사용하면 비밀번호 없이 SSH 키를 사용하여 원격 서버에 SSH로 연결할 수 있습니다.
내 로컬 컴퓨터의 서버에 연결하는 SSH 명령은 다음과 같습니다.
ssh -i [KEY] -p [XXXX] [USER]@[HOST] '123' <<< "$VALUE" > OUTPUT
- 스크립트는 변수로부터
run
문자열을 받습니다.123
$VALUE
run
SSH 서버의 내 스크립트 이름
#!/bin/bash
echo "WELCOME TO SSH"
read VALUE
echo $VALUE
이것은 실제 스크립트가 해시를 생성한다는 의미를 보여주는 예일 뿐입니다.
- 내 로컬 컴퓨터에서는
OUTPUT
원격 SSH 서버 스크립트의 결과를 내 파일에 저장/저장합니다.run
내 로컬 파일 OUTPUT
과 서버의 결과
WELCOME TO SSH
123
이 명령은 read VALUE
메시지를 표시하지 않고 123
변수에 값을 저장 $VALUE
하고 결과를 로컬 컴퓨터에 저장합니다.
단계:
- SSH 서버에 연결
- 내 로컬 컴퓨터에서 원격 SSH 서버로 문자열 보내기
- 원격 서버는 이 문자열을 새로운 결과로 변경합니다.
- 새 결과를 로컬 컴퓨터의 파일에 저장
ssh 명령을 시작하면 연결이 열립니다.
스크립트가 작동하고 WELCOME TO SSH
터미널에서 확인됩니다.
내 로컬 컴퓨터에서 결과를 수신하고 연결이 닫힙니다.
이 예제를 컴퓨터에서 쉽게 테스트하여 무슨 뜻인지 확인할 수 있습니다.
이것이 바로 나에게 필요한 것이지만 다음 사항을 알고 싶습니다.
왜 나에게 필요합니까?read
메시지가 수신되지 않는 이유는 무엇입니까?
이 예에 대한 다른 해결책은 무엇입니까?
감옥에 갇힌 사용자를 사용하여 SSH를 통해 서버의 스크립트에 문자열을 보내고 결과를 내 로컬 컴퓨터의 서버에서 파일로 저장하려면 어떻게 해야 합니까?
솔루션 업데이트
@ilkkachu 답변에서 다음 명령을 실행하고 보낼 수 있습니다.
문자열 및 변수:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] "123" "$VALUE" > OUTPUT
끈:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] "123"> OUTPUT
바꾸다:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] "$VALUE" > OUTPUT
아무것도 없습니다:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] > OUTPUT
#!/bin/bash
value= # empty by default
if [ "$1" = -c ]; then
value="$2"
fi
if [ -z "$value" ]; then
echo "value is empty" >&2
exit 1
fi
# do something with the value
echo "$value" | rev
SSHauthorized_keys 명령 옵션
이 기사에서:
SSHauthorized_keys 명령 옵션: 여러 명령이 있습니까?
아니요, 이것은 "허용" 명령이 아니라 "강제" 명령(ForceCommand 옵션)입니다. 유일한 가능성은 다른 명령에 대해 다른 키를 사용하거나 표준 입력에서 인수를 읽는 것입니다.
이것은 좋은 팁이지만 백업이나 일부 정보 출력과 같은 단일 명령에 적용됩니다.
rsync
유사한 명령을 실행하는 경우 오류가 발생하지 않도록 하려면 추가 구성을 수행해야 합니다.
그래서 나는 단순 감옥에 갇힌 사용자와 주어진 스크립트를 계속 사용할 것입니다.
답변1
사용법은 ssh user@somehost <<< "$value"
거의 동일합니다 echo "$value" | ssh user@somehost
. 변수의 내용이 SSH 클라이언트 프로세스의 표준 입력으로 전송됩니다. SSH는 이를 원격 측으로 전송하며, 원격 프로세스는 표준 입력에서 이를 다시 읽을 수 있습니다. 예를 들어, read
여기서 했던 것처럼 쉘의 를 사용하십시오 . 이는 SSH 연결을 통해 데이터를 전달하는 방법입니다.
또 다른 방법은 명령줄 매개변수를 사용하는 것입니다. 당신이 달리면
ssh user@somehost "some string here"
-c
그런 다음 SSH는 원격 측에 두 개의 매개변수를 요청하고 원격 사용자의 쉘을 실행합니다 some string here
. 와정상셸을 사용하면 셸이 "여기의 일부 문자열"을 셸 명령줄로 해석하여 ssh user@somehost "ls /tmp"
실제로 실행됩니다 ls
. ( ssh user@somehost ls /tmp
동일한 작업을 수행하면 SSH 클라이언트는 인수를 원격으로 보내기 전에 공백으로 연결합니다.)
그러나 사용자가 수행할 수 있는 작업을 제한하기 위해 사용자의 셸을 변경했으므로 이 -c
옵션은 SSH에서 가정하는 작업을 수행하지 않습니다. 같은 이유로 프롬프트가 없습니다. 스크립트는 일반 쉘처럼 프롬프트를 인쇄하지 않습니다.
그러나 스크립트가 셸인지 여부는 중요하지 않습니다. 스크립트는 이 -c
옵션을 감지하고 무시하고 그 뒤에 오는 항목을 사용할 수 있기 때문입니다.
예를 들어, 리모컨에 다음과 같은 스크립트가 있을 수 있습니다.
#!/bin/bash
value= # empty by default
if [ "$1" = -c ]; then
value="$2"
fi
if [ -z "$value" ]; then
echo "value is empty" >&2
exit 1
fi
# do something with the value
echo "$value" | rev
모의 예제에서는 값을 전달하여 문자열을 반전합니다 rev
.
따라서 실행하면 ssh user@somehost "hello there"
문자열이 반환됩니다 ereht olleh
.
ssh user@somehost
끝에 "명령"을 입력하지 않고 그냥 실행하면 스크립트에 오류 메시지가 표시되지만 SSH는 대화형 세션을 시작하는 것처럼 동작하게 됩니다. 원격으로 의사 터미널(pty)을 유지 관리하고 Linux에서 PAM 세션 모듈을 실행하는 것과 같이 로그인 중에 일반적으로 수행되는 일부 추가 작업을 실행할 수 있습니다. 이러한 기능은 "오늘의 메시지"를 인쇄하거나 계정에서 읽지 않은 이메일을 확인하는 등의 작업을 수행할 수 있습니다. 와 동일 ssh user@somehost ""
하므로 실제로 통과할 수 없습니다.비어 있는매개변수를 사용하고 null이 아닌 매개변수와 똑같이 동작할 것으로 예상합니다.
원격 사용자의 셸을 제한하는 것 외에도 SSH를 통해 실행할 수 있는 명령을 잠그는 또 다른 대안은 SSH 키를 사용하고 command=...
in 을 사용하는 것입니다 authorized_keys
. 이렇게 하면 no-pty
키워드를 사용하여 pty 할당을 비활성화할 수도 있습니다. (키 관련 강제 명령을 실행하는 것만으로도 이러한 PAM 세션 모듈 실행에 영향을 미칠 수 있습니다.) sshd를 참조하세요.매뉴얼 페이지.
답변2
내 생각엔 당신이 혼란스러워 하는 것 같아요.
너 뭐야처음에는질문:
로컬 값이 있는 경우(예: 로컬 컴퓨터에) 원격 컴퓨터로 이동하지 않고도 VALUE="XXXXXXXX"
해당 값을 로컬 파일에 저장할 수 있습니다 .OUTPUT
너 뭐야실제로묻고 싶은 것:
가능성 1:내 생각에는 원격 값(예: VALUE="XXXXXXXX"
원격 시스템)이 필요하고 이를 로컬 파일에 저장해야 합니다 OUTPUT
.
솔루션 1:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] 'echo ${VALUE}' > OUTPUT
참고: 큰따옴표가 아닌 작은따옴표입니다!
여기서 작은따옴표는 VALUE
로컬 시스템에서는 평가되지 않고 원격 시스템에서는 평가되도록 보장합니다.
너 뭐야실제로묻고 싶은 것:
가능성 2: "원격 시스템에서 실행 중인 스크립트에 VALUE 값을 보내고 싶습니다. 그러면 새 값이 출력됩니다. 해당 새 값을 로컬 파일 OUTPUT에서 사용하고 싶습니다."
솔루션 2:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] /path/to/myscript "${VALUE}" > OUTPUT
참고: 작은따옴표가 아니라 큰따옴표입니다!
여기에서는 명령줄 인수를 통해 VALUE를 스크립트에 전달합니다. /path/to/myscript에서 $1을 통해 값에 액세스할 수 있습니다. 예를 들면 다음과 같습니다.
VALUE=$1
echo " I got $1 which I am storing in the variable VALUE which now contains $VALUE "
#### Process VALUE & Compute new value and echo it
너 뭐야실제로묻고 싶은 것:
가능성 3: "사용자가 로그인하고, 미리 정의된 스크립트( /home/[USER]/./run
)를 실행하고 로그아웃만 할 수 있는 원격 컴퓨터가 있습니다. 원격 컴퓨터에서 실행 중인 스크립트에 VALUE 값을 보내면 새로운 값이 출력됩니다. 로컬 파일 출력의 새 값"
해결 방법 3:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] MYVALUE "${VALUE}" > OUTPUT
참고: 작은따옴표가 아니라 큰따옴표입니다!
여기서는 명령줄 매개변수를 통해 문자열 "MYVALUE"와 변수 VALUE의 값을 스크립트에 전달합니다. 스크립트에서 /home/[USER]/./run
$1, $2, $2 등을 통해 이러한 명령줄 매개변수 값에 액세스할 수 있습니다.
#!/bin/bash
echo "WELCOME TO SSH"
echo " I got \$1 which $1 "
echo " I got \$2 which $2 "
echo " I got \$3 which $3 "
echo " I got \$4 which $4 "
echo " I got \$5 which $5 "
echo " I got \$6 which $6 "
echo " I got \$7 which $7 "
echo " I got \$8 which $8 "
echo " I got \$9 which $9 "
#### echo " I got STRING MYVALUE in ${N} and the value VALUE in ${M} which I am storing in the remote variable VALUE "
#### VALUE=${M}
#### echo $($VALUE + $VALUE)
여기서는 모든 명령줄 매개변수 값 $1, $2, $3, $4, $5, $6, $7, $8, $9를 에코하여 어느 항목에 STRING MYVALUE가 있고 어느 항목에 변수 VALUE 값이 있는지 확인합니다.
예를 들어 $3의 값이 올바른 경우 불필요한 echo
줄을 모두 삭제하고 마지막 3줄의 주석 처리를 해제한 후 N & M을 업데이트하고 제대로 작동하는지 확인하세요.