메일 병합 SSH에서 "알 수 없는 이름 또는 서비스"가 나타납니다.

메일 병합 SSH에서 "알 수 없는 이름 또는 서비스"가 나타납니다.

저는 (다른 흥미로운 것들 중에서) 원격 호스트에서 일련의 명령을 실행하는 bash 스크립트를 작성하고 있지만 ssh 명령은 "알 수 없는 이름 또는 서비스"와 함께 실패합니다. 다음 스크립트는 동작을 재현합니다.

#!/bin/bash

function apply {
    local cmd_template cmd_arg logfile
    cmd_template=$1
    cmd_arg=$2
    logfile=$3
    local cmd

    cmd=${cmd_template//'{}'/${cmd_arg}}
    echo "cmd is ${cmd}"
    ${cmd} >${logfile} 2>&1
}

USER="symcbean"
HOST="ssh.example.com"
SCRIPT="sleep"
TEMPLATE="ssh \"${USER}@${HOST}\" \"${SCRIPT}\" {}"

apply "${TEMPLATE}" "1" "/tmp/test.$$"

산출:

cmd is ssh "[email protected]" "sleep" 1
ssh: Could not resolve hostname ssh.example.com": Name or service not known

그러나 DNS는 존재하고 작동합니다. 또한 출력에서 ​​ssh 명령을 복사하여 붙여넣으면 예상대로 작동합니다.

내가 여기서 무엇을 놓치고 있는 걸까요?

(누군가 제안하기 전에 나는 단지 xargs 또는 병렬 처리를 사용합니다. 실제 구현에는 여기에 존재하지 않는 동작이 필요합니다.)

답변1

실제로 단서는 오류 메시지에 있습니다.

ssh: Could not resolve hostname ssh.example.com": Name or service not known

일치하지 않는 큰따옴표에 유의하세요.

ssh는 "username@host"를 "usernamesum 으로 분할합니다 host". 해결책은 TEMPLATE=에서 이에 대한 참조를 제거하는 것입니다.

이는 사용자 이름에 공백이 포함되어 있으면 스크립트가 작동하지 않는다는 것을 의미합니다. 하지만 이는 허용 가능한 절충안입니다(이 상황은 다른 많은 영향을 미칠 수 있으므로).

나는 여기서 문제를 창의적으로 해결할 수 있었을 것이라고 생각 eval하지만 이것이 내 구현에서 나타나는 방식으로 인해 다른 문제가 발생했습니다.

관련 정보