0

我在 Heroku 上部署了一个定期将文件上传到 ssh 服务器的工作人员。它写在 Node.js 上,它确实:

require('child_process').exec('scp -i id_rsa myfile.txt myuser@myserver.com:updated.txt', function() { ... });

为了连接到服务器,存储库有一个 *id_rsa* 文件,其私钥比myserver.com授权的私钥。我已经在两台计算机上对其进行了测试(与myserver.com没有密钥交换)并且它可以工作,但是当我将它上传到 Heroku 时,它 scp 输出:

Host key verification failed.

为什么?

笔记

我也试过而不是执行scp

cat file.txt | ssh [myuser]@[myserver] "cat > updated.txt"

同样的问题。

更新

执行ssh -v ...它输出:

[...]
debug1: read_passphrase: can't open /dev/tty: No such device or address
Host key verification failed.
[...]

我无法在 Heroku 上访问 tty?

这是 repo 上的所有文件:

main.js

require('child_process').exec('scp -i id_rsa file.txt [myuser]@[myserver]:updated.txt', function(error, stdout, stderr) {
    if (error)
        console.error('FAILED', stderr.toString());
    console.log('OUTPUT', stdout.toString());
});

id_rsa

-----BEGIN RSA PRIVATE KEY-----
[censored]
-----END RSA PRIVATE KEY-----

包.json

{
    "name": "exta",
    "version": "0.0.1",
    "engines": { "node": "0.6.x" }
}

档案

worker: node main

文件.txt

Testing
4

1 回答 1

5

发现问题,不是在 RSA 密钥上,而是在服务器密钥上。

第一次在两台计算机之间建立 SSH 连接时,SSH 要求您将服务器的密钥添加到~/.ssh/known_hosts以执行此操作,它会尝试将其提示到 tty。因为我已经在我的计算机上接受了我的服务器密钥,所以当我在本地测试它时并没有发生这种情况。

由于我不确定如何命令我的程序将密钥添加到~/.shh/known_hosts我已经欺骗 SSH 添加密钥而不询问:

ssh -i id_rsa -o -o StrictHostKeyChecking=no [myuser]@[myserver]

由于我不想接触 Heroku 的环境,我还要求 ssh 将密钥存储在/dev/null上,因此没有任何修改:

ssh -i id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [myuser]@[myserver]

而且......它的工作原理!:D

于 2013-02-21T16:37:42.827 回答