2015-10-08 2 views
0

Я пытаюсь добавить открытый ключ в свой локальный каталог $ HOME/.ssh /, используя Go.Копирование открытого ключа ssh на сервер

Я выполнял несколько команд с этим же кодом без проблем, но не для этого конкретного.

identity := fmt.Sprintf("cat %s/.ssh/%s.pub", fileUtil.FindUserHomeDir(), p.sshkey.name) 
address := fmt.Sprintf("| ssh %[email protected]%s 'cat >> ~/.ssh/authorized_keys', p.projectname.name, p.host.name) 

cmd := exec.Command(identity, address) 

err := cmd.Run() 
if err != nil { 
    log.Fatal(err) 
} 

В основном я пытаюсь запустить:

cat /home/foo/.ssh/foobar.pub | ssh [email protected] 'cat >> ~/.shh/authorized_keys'" 

, который работает хорошо, если я запускаю его через командную строку непосредственно.

Я хочу запустить эту программу на разных компьютерах OS X, где у некоторых нет установленного идентификатора ssh-copy. Поэтому я не собираюсь использовать его.

Но, в любом случае, я открыт для других предложений. Заранее спасибо.

+1

'exec.Command' не является оболочкой, поэтому нет понятия' ''. См. Http://stackoverflow.com/questions/10781516/how-to-pipe-several-commands-in-go – JimB

+0

Вы можете использовать exec.Command для выполнения оболочки, хотя: 'sh -c command' – kostya

ответ

4

Вам не нужно выполнять /bin/sh -c "cat file", чтобы прочитать файл в Go. Откройте файл в обычном режиме и передайте команду ssh

keyFile, err := os.Open(filename) 
if err != nil { 
    log.Fatal(err) 
} 

cmd := exec.Command("ssh", "[email protected]", "cat >> ~/.ssh/authorized_keys") 
cmd.Stdin = keyFile 

// run the command however you want 
out, err := cmd.CombinedOutput() 
if err != nil { 
    fmt.Println(string(out)) 
    log.Fatal(err) 
} 
+0

Большое спасибо @ JimB –

1

Вы можете просто выполнить rsync или scp для этой цели.

Смежные вопросы