Не удалось выполнить команду с другой командой внутри

# #go

Вопрос:

Извините, если название не очень понятно, я пытаюсь запустить ssh команду ProxyCommand в одной строке:

 ssh -i /home/myuser/.ssh/myprivatekey.pem ec2-user@i-00xxxxxxxxxx -o ProxyCommand="aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

 

Эта команда выше работает, однако мне нужно сделать то же самое в go.

 func (s SSH) Tunnel() error {
    parts := strings.Fields(`ssh -i /home/myuser/.ssh/myprivateksy.pem ec2-user@i-00xxxxxxxxxxx`)
    parts = append(parts, `-o ProxyCommand="aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"`)

    command := exec.Command(parts[0], parts[1:]...)
    command.Stderr = os.Stderr
    command.Stdout = os.Stdout
    command.Stdin = os.Stdin
    return command.Run()
}
 

Однако я получил эту ошибку:

 zsh:1: command not found: aws ssm start-session --target i-00Xxxxxxxxxxxx --document-name AWS-StartSSHSession --parameters 'portNumber=22'
 

Я попытался включить его в strings.Fields :

 parts := strings.Fields(`ssh -i /home/myuser/.ssh/myprivateksy.pem ec2-user@i-00xxxxxxxxxxx -o ProxyCommand="aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"`)

 

Однако с этим у меня есть еще одна ошибка:

 zsh:1: unmatched " 
 

Как я могу этого достичь?

Спасибо

Ответ №1:

Основываясь на введенных вами данных оболочки, должно работать следующее:

 parts := strings.Fields(`ssh -i /home/myuser/.ssh/myprivateksy.pem ec2-user@i-00xxxxxxxxxxx -o`)
parts = append(parts, `ProxyCommand=aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'`)
 

Это передаст последующую часть в -o виде одного аргумента без кавычек. Обработка оболочки удалит эти кавычки.

Комментарии:

1. Да, это так, спасибо!