你好,我有一个小问题,我开发了一个带有节点js的脚本sftp客户端,它连接到sftp服务器并抓取一些文件,我用本地服务器测试了它的工作,但是当我尝试将它与生产服务器一起使用时,我收到了这个错误 :
错误:握手失败:没有匹配的密钥交换算法
我已经使用生成了 rsa 密钥ssh-keygen
这是脚本的相关部分:
var Client = require('ssh2').Client;
var fs = require('fs');
var path = require('path');
var args = process.argv.slice(2);
var connSettings = {
host: args[0] || '127.0.0.1',
port: args[1] || 22,
username: args[2] || 'karim',
password: args[3] || 'karimos',
algorithms: {
hmac: ['hmac-sha2-256', 'hmac-sha2-512', 'hmac-sha1', 'hmac-sha1-96']
}
};
Run Code Online (Sandbox Code Playgroud) 我的 java 程序使用 ssh/sftp 将文件传输到 linux 机器(显然......),而我这样做的库是 JSch(尽管这不是罪魁祸首)。
现在,其中一些 linux 机器具有 shell 登录启动脚本,这可悲地导致 ssh/sftp 连接失败,并显示以下消息:
收到的消息太长 1349281116
在简要阅读之后,这显然是一个已知的 ssh 设计问题(不是错误 -请参阅此处)。并且所有建议的解决方案都在 ssh 服务器端(即禁用在 shell 登录期间输出消息的脚本)。
我的问题 - 是否可以选择在客户端避免此问题?
我有一个使用SFTP连接下载文件的应用程序.它在PHP 5.6中正常工作,而不是在PHP 7中工作.我得到的错误如下:
PHP警告:filesize():ssh2.sftp的stat失败...
我的代码如下:
public function retrieveFiles($downloadTargetFolder,$remoteFolder = '.') {
$fileCount = 0;
echo "\nSftpFetcher retrieveFiles\n";
$con = ssh2_connect($this->host,$this->port) or die("Couldn't connect\n");
if($this->pubKeyFile){
$isAuth = ssh2_auth_pubkey_file($con, $this->user, $this->pubKeyFile, $this->privKeyFile);
} else {
$isAuth = ssh2_auth_password($con, $this->user, $this->pass);
};
if ($isAuth) {
$sftp = ssh2_sftp($con);
$rd = "ssh2.sftp://{$sftp}{$remoteFolder}";
if (!$dir = opendir($rd)) {
echo "\nCould not open the remote directory\n";
} else {
$files = array();
while (false != ($file = readdir($dir))) {
if ($file == "." || $file == …Run Code Online (Sandbox Code Playgroud) 我在通过ssh2-sftp-client(https://www.npmjs.com/package/ssh2-sftp-client)从缓冲区上传文件时遇到困难,我正在使用Multer来上传文件,定位req.file.buffer访问要通过sftp客户端上传的数据,如下所示:
sftp.connect({
host: 'some.IP.address.here',
port: '22',
username: 'username',
password: 'password'
})
.then(() => {
return sftp.put(req.file.buffer, '/var/www/bucket', false);
})
.catch((err) => {
console.log(err, 'catch error');
});
Run Code Online (Sandbox Code Playgroud)
我不知道如何为存储在req.file.originalname Multer对象中的上载文件分配名称。
顺便说一句,ssh2-sftp-client返回以下错误:
Error: Failure
image.routes.js:39
code:4
lang:""
message:"Failure"
stack:"Error: Failure\n at SFTPStream._transform (/Users/petrfila/Apps/lifeIQ/liq-api/node_modules/ssh2-streams/lib/sftp.js:410:27)\n at SFTPStream.Transform._read (_stream_transform.js:185:10)\n at SFTPStream._read (/Users/petrfila/Apps/lifeIQ/liq-api/node_modules/ssh2-streams/lib/sftp.js:181:15)\n at SFTPStream.Transform._write (_stream_transform.js:173:12)\n at doWrite (_stream_writable.js:406:12)\n at writeOrBuffer (_stream_writable.js:392:5)\n at SFTPStream.Writable.write (_stream_writable.js:290:11)\n at Channel.ondata (_stream_readable.js:646:20)\n at Channel.emit (events.js:127:13)\n at addChunk (_stream_readable.js:269:12)\n at readableAddChunk (_stream_readable.js:256:11)\n at Channel.Readable.push (_stream_readable.js:213:10)\n at SSH2Stream.<anonymous> …
我正在用 Node.js 编写一个微服务,它运行一个特定的命令行操作来获取特定的信息。该服务在多个服务器上运行,其中一些在 Linux 上,一些在 Windows 上。我正在使用ssh2-exec连接到服务器并执行命令,但是,我需要一种方法来确定服务器的操作系统以运行正确的命令。
let ssh2Connect = require('ssh2-connect');
let ssh2Exec = require('ssh2-exec');
ssh2Connect(config, function(error, connection) {
let process = ssh2Exec({
cmd: '<CHANGE THE COMMAND BASED ON OS>',
ssh: connection
});
//using the results of process...
});
Run Code Online (Sandbox Code Playgroud)
我有一个解决方案的想法:按照这个问题,预先运行一些其他命令,并从所述命令的输出中确定操作系统;但是,我想了解是否有更“正式”的方式来实现这一点,特别是使用SSH2库。
尝试使用时
ssh2_sftp($this->con);
Run Code Online (Sandbox Code Playgroud)
PHP 7.1.7认为Im正在类中寻找函数。经过一番阅读后,我发现需要从PECL(http://php.net/manual/en/wrappers.ssh2.php)安装SSH2。
当我这样做时,出现以下错误:
pecl/ssh2 requires PHP (version >= 4.0.0, version <= 6.0.0), installed version is 7.1.7
No valid packages found
install failed
Run Code Online (Sandbox Code Playgroud)
任何人都对如何使其在PHP 7.1.7的MacOs 10.13.3(17D47)上运行有任何想法?提前致谢!
我正在使用“ssh2-sftp-client”来完成这项工作。因此,如果我先将文件复制到 Lambda 的 /tmp/ 文件夹,然后将其上传到 s3,则基本上它可以正常工作。我想将读取流指向 s3 而不保存在 lambda /tmp/ 文件夹中。
所以基本上:
let sftp = new Client();
sftp.connect({
host: Config.host,
port: Config.port,
username: Config.user,
password: Config.password
}).then(() => {
return sftp.list('/photos');
}).then((files) => {
return get(files)
}).then((streams) => {
return streamToString(streams)
}).then((dataArray) => {
return uploadToS3.putBatch(Config,dataArray)
}).then(() => {
return cleanSFTP();
}).then(() => {
context.done();
}).catch((err) => {
console.log('Catch Error: ', err);
context.fail();
});
Run Code Online (Sandbox Code Playgroud)
从 sftp 获取读取流:
function get(files) {
return Promise.all(files.slice(0, 2).map((file) => {
fileList.push(file.name);
return sftp.get(BASIC_URL + '/' …Run Code Online (Sandbox Code Playgroud) 我试图在同一个类的方法连接中调用方法测试。但我得到的只是“未捕获的类型错误:无法读取未定义的属性‘test’”。如何访问 sftp 回调中的任何变量?为什么会这样?
这是我的代码:
const SSH2 = require('ssh2').Client;
class SshClient {
constructor(host, username, password) {
this.host = host;
this.username = username;
this.password = password;
this.port = 22;
this.client = null;
}
test(testvar) {
console.log(testvar);
}
connect() {
this.client = new SSH2();
let client = this.client;
let username = this.username;
this.client.connect({
host: this.host,
port: this.port,
username: this.username,
password: this.password
});
this.client.on('ready', function() {
console.log('Client :: ready', client);
client.sftp(function(err, sftp) {
if (err) throw err;
sftp.readdir('/home/' + username, function(err, list) {
if …Run Code Online (Sandbox Code Playgroud)我正在尝试使用 Firebase Cloud Functions 将文件发送到 webtrends ftp 服务器,但遇到了无法解决的问题。由于我使用 Firebase Cloud Functions,我的函数是从 Nodejs 服务器运行的。我正在使用这个 npm 包:https://www.npmjs.com/package/ssh2-sftp-client。
在线阅读并解释调试日志后,我了解到问题是服务器使用了已弃用的加密算法(ssh-dss)。我在这里读到https://www.openssh.com/legacy.html ssh-dss 是遗留的,因此不受 ssh2 支持。
我发现的大多数其他解决方案都告诉我配置 ssh 配置,但在这种情况下我无权访问远程并且无法配置它。
这是我用来连接的代码:
const Client = require('ssh2-sftp-client');
const sftp = new Client();
sftp.connect({
host: 'sftp.webtrends.com',
port: '****', // omitted
username: '****', // omitted
password: '****', // omitted
algorithms: {
serverHostKeys: ['ssh-dss'],
},
});
Run Code Online (Sandbox Code Playgroud)
这是调试日志:
DEBUG: Local ident: 'SSH-2.0-ssh2js0.1.20'
DEBUG: Client: Trying sftp.webtrends.com on port **** ...
DEBUG: Client: Connected
DEBUG: Parser: IN_INIT
DEBUG: Parser: IN_GREETING
DEBUG: …Run Code Online (Sandbox Code Playgroud) 我们已经更改了托管公司,ssh2工作的地方已经不再适用了.我们已ssh2启用新服务器并已allow_url_fopen启用.
我能看到的唯一区别是使用的旧服务器PHP 5.4.45和新服务器正在使用PHP 5.6.28.
但是,我现在得到以下错误.
Could not open remote file: ssh2.sftp://Resource id #337/my/directory/file.txt
这是我的代码示例:
$remote_host = "myhostinfohere";
$remote_port = 22;
$remote_user = "myuser";
$remote_pass = "mypassword";
$remote_dir = "/my/directory/";
$remote_file = 'file.txt';
try {
$remote_conn = ssh2_connect($remote_host, $remote_port);
} catch (Exception $e) {
die("could not connect to ".$remote_host);
}
try {
ssh2_auth_password($remote_conn, $remote_user, $remote_pass);
} catch (Exception $e) {
die("Password failed on ".$remote_host);
}
$sftp = ssh2_sftp($remote_conn);
$fetch_string = "ssh2.sftp://$sftp" . $remote_dir …Run Code Online (Sandbox Code Playgroud) 我正在使用 ssh2-sftp-client 读取 CSV 文件并创建一个 ReadableStream。然后我试图在库 csvtojson 的帮助下将此 readableStream 转换为 Json。但是,我总是收到以下错误:
类型错误:readStream.pipe 不是函数
到目前为止,这是我的代码:
let Client = require('ssh2-sftp-client');
let sftp = new Client();
var csv = require("csvtojson");
sftp.connect({
host: 'HOST',
port: 'PORT',
username: 'USERNAME',
password: 'PASSWORD'
}).then(() => {
return sftp.get('/home/user/etc/testfile.csv');
}).then((data) => {
csv()
.fromStream(data)
.subscribe(function (jsonObj) { //single json object will be emitted for each csv line
// parse each json asynchronousely
return new Promise(function (resolve, reject) {
resolve()
console.log(jsonObj);
})
})
}).catch((err) => {
console.log(err, 'catch error'); …Run Code Online (Sandbox Code Playgroud)