我在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 为什么? 我也尝试过不执行scp: 同样的问题。 正在执行ssh-v它输出: 我无法访问Heroku上的tty? 这是回购上的所有文件:Host key verification failed.
注释
cat file.txt | ssh [myuser]@[myserver] "cat > updated.txt"
更新
[...]
debug1: read_passphrase: can't open /dev/tty: No such device or address
Host key verification failed.
[...]
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-----
package.json
{
"name": "exta",
"version": "0.0.1",
"engines": { "node": "0.6.x" }
}
Procfile
worker: node main
file.txt
Testing
发现问题不在RSA密钥上,而是在服务器密钥上。
第一次在两台计算机之间建立SSH连接时,SSH会要求您将服务器的密钥添加到~/.SSH/nknown_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