我想使用 PHP 读取远程文本文件(最好使用 fopen)。当我在本地文件上使用此函数时,我的脚本使用 fopen 工作。
我试过了:
$file = fopen ("http://abc.abc.abc", "r");
if (!$file) {
echo "<p>Unable to open remote file.\n";
exit;
}
Run Code Online (Sandbox Code Playgroud)
我得到了:
警告: fopen( http://abc.abc.abc ): 无法打开流: 由于目标机器主动拒绝,无法建立连接。在 C:\xampp\htdocs\NMR\nmrTest5.php 中第 2 行无法打开远程文件。
我读过phpseclib可能是一个不错的选择,因为我可以使用 WinSCP (SFTP) 或使用 Puttyfor 访问我的文件,所以我尝试了这个(将所有文件从 phpseclib 复制到我的目录后)希望我可以在本地复制文件,然后用 fopen 读取它(不是最好的遇见,但我可以忍受):
include('Net/SFTP.php');
$sftp = new Net_SFTP('abc.abc.abc');
if (!$sftp->login('username', 'pass')) {
exit('Login Failed');
}
Run Code Online (Sandbox Code Playgroud)
我得到了:
注意:没有在 C:\xampp\htdocs\NMR\Net\SSH2.php 中找到兼容的服务器到客户端加密算法,第 1561 行登录失败
有趣的是,如果我连接到服务器(使用 WinSCP),我会收到一条不同的消息:
注意:从第 3362 行 C:\xampp\htdocs\NMR\Net\SSH2.php 中的套接字读取错误
注意:Connection 在 C:\xampp\htdocs\NMR\Net\SSH2.php 中被服务器关闭,第 1471 行登录失败
关于如何让它工作的任何想法?理想情况下我会使用 fopen 但我对其他解决方案持开放态度。
我在使用PHP来SFTP上传文件到远程服务器时遇到了麻烦.当我使用cURL时,我收到此处描述的错误:
来自PHP的SFTP - 未定义的常量CURLOPT_PROTOCOLS和CURLPROTO_SFTP?
我也按照以下建议尝试了phpseclib:
但是,当我尝试phpseclib时,我得到这些错误:
Warning: require_once(Math/BigInteger.php) [function.require-once]: failed to open stream: No such file or directory in /home/john/public_html/test/Net/SSH2.php on line 53
Fatal error: require_once() [function.require]: Failed opening required 'Math/BigInteger.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/john/public_html/test/Net/SSH2.php on line 53
Run Code Online (Sandbox Code Playgroud)
然后我尝试在php中使用系统命令,但没有任何反应:
<?php
echo system('sftp user@ftp.domain.com');
echo system('password');
echo system('put file.csv');
?>
Run Code Online (Sandbox Code Playgroud)
我也试过了
<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
?>
Run Code Online (Sandbox Code Playgroud)
但是我的php服务器说没有定义ss2_connect.
我试图从终端做以下事情
scp file.csv user@ftp.remote.com
password
Run Code Online (Sandbox Code Playgroud)
但是服务器不允许使用scp命令.我没有shell访问权限来创建ssh密钥.
我现在能做的就是从终端sftp并手动上传.但我真的想自动化这个,所以PHP网站可以做到这一切.
关于如何从PHP上传SFTP的教程并不多.是因为这是一件坏事吗?如果是这样,我该怎么办?我要上传的服务器只允许sftp连接.
我正在使用PHPseclib将文件从本地文件服务器传输到远程文件服务器。我能够连接到服务器,对本地文件服务器上的目标文件具有0777权限,但是$ sftp-> put失败。现在它返回布尔值,但是有没有办法我可以提取实际的错误消息或至少一个错误代码?
我试过$ sftp-> error,但是该值为null。我正在运行PHP5.1(无法升级到最新版本b / c,它实际上不是我的服务器)。
解:
使用$ sftp-> getSFTPErrors()返回带有sftp错误的数组。
我的模型中有以下功能:
public function createfolder($location, $name){
define('NET_SFTP_LOGGING', NET_SFTP_LOG_COMPLEX);
$sftp = new Net_SFTP('xx.xxx.xx.xx');
if (!$sftp->login('admin', '********')) {
exit('Login Failed');
}
//moves to a location (Job folder for example)
$sftp->chdir($location);
//makes the folder
$sftp->mkdir($name);
}
Run Code Online (Sandbox Code Playgroud)
这可行,但我想添加某种错误预防验证,如何使用 SFTP 检查文件夹是否存在?
我想我想出了一个解决方案:
chdir()更改目录、mkdir()创建目录和rmdir()删除目录。一旦失败,他们都会返回false。chdir()、mkdir()、 并在操作成功完成时rmdir()返回。true
所以我可以使用一个if语句来检查if chdir() === true或false查看该目录是否存在。
我正在尝试从PHP进行SSH,但出现以下错误:
注意:无法连接到[主机]。错误13。在第875行的/usr/share/php/Net/SSH2.php中,权限被拒绝
这是代码:
<?PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
include_once('Net/SSH2.php');
define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);
$ssh = new Net_SSH2($host);
if( $ssh->login($id, $pw) )
{
error_log("logged");
$result['data'] = $ssh->exec('dir');
}
else
{
error_log( $ssh->getLog() );
}
?>
Run Code Online (Sandbox Code Playgroud)
但是,当我在apache中从命令行运行相同的代码时,它运行良好。
我对使用paramiko进行SSH并从apache调用的python脚本有完全相同的问题。它可以从命令行正常运行,但是在Apache中从PHP调用时失败,并显示权限错误。使用此脚本只是一个测试;python不会在最终解决方案中使用。
那么,为什么SSH在Apache外部而不是在内部工作?我已经使用su从命令行以apache的身份运行PHP代码,并且该方法也有效,因此这不是用户权限问题。
更新:
AAaarrrggh!被SELinux再次咬伤。此页面具有解决方案: php run git得到了“ ssh许可被拒绝”
答案是:
setsebool -P httpd_can_network_connect=1
Run Code Online (Sandbox Code Playgroud)
基本上,apache无权启动网络连接!
我忽略了这是在CentOS系统上的问题,因此在SELinux的密切关注下,这是我的错。
我已经从 github安装了phpseclib库,我正在尝试使用 PHP 加密密码(用于 Steam 社区)。我可以通过使用 Steam 在他们网站上的 javascript 代码来使用 Javascript 来做到这一点,但我无法使用纯 PHP 加密密码。
Javascript 加密代码:
var RSAPublicKey = function($modulus_hex, $encryptionExponent_hex) {
this.modulus = new BigInteger( $modulus_hex, 16);
this.encryptionExponent = new BigInteger( $encryptionExponent_hex, 16);
};
var Base64 = {
base64: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
encode: function($input) {
if (!$input) {
return false;
}
var $output = "";
var $chr1, $chr2, $chr3;
var $enc1, $enc2, $enc3, $enc4;
var $i = 0;
do {
$chr1 = $input.charCodeAt($i++);
$chr2 = $input.charCodeAt($i++);
$chr3 = $input.charCodeAt($i++); …Run Code Online (Sandbox Code Playgroud) 我正在尝试composer require phpseclib/mcrypt_compat:dev-master在一个空目录中运行并收到以下错误:
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for phpseclib/mcrypt_compat dev-master -> satisfiable by phpseclib/mcrypt_compat[dev-master].
- phpseclib/mcrypt_compat dev-master requires phpseclib/phpseclib dev-master -> satisfiable by phpseclib/phpseclib[d
ev-master] but these conflict with your requirements or minimum-stability.
Installation failed, deleting ./composer.json.
Run Code Online (Sandbox Code Playgroud)
我不明白。https://github.com/phpseclib/phpseclib/blob/master/composer.json说所需的最低 PHP 版本是 5.6.1。还有两个其他库是必需的,但 Composer 并不是说其他库不兼容 - Composer 说 phpseclib/phpseclib 不兼容。
这是我输入时得到的输出 …
我正在使用由 phpseclib 生成的密钥对,然后我用它在 C# 中加密一条消息并在 PHP 中解密。
公钥是:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvh4OvlS5+7Skk5Nij296
rDAKQsxZrz+gV/MInvWqe/SAOlOf8vqs6xJsn7sd523X8m+b0Kd751UbeeDQRGjC
mbQc9iwQHUFrNa0bSVnpyoc27K+cuxNdtoPG1XXRCFLKKqVJKSyB5ZPu+oQr+OIo
6zYhU5jfCEYbpzPdyYqfDGJPpJv/r8F11MCBrdbvD5Z42ysTDqSxFGIfROWtDOP5
ShSNcVGRQYfX3E/v8j+qy0yu2PD/W1UqNd3m6TTkUj/u1XukUMWp+tfXEdEp7IEU
askvGnBfHgJcsBp2c6kT9WxIU0ai4G8mo/2OsHprw42PBWLcJwfUeUgY3itSczni
WQIDAQAB
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
到 XML 的转换是通过https://superdry.apphb.com/tools/online-rsa-key-converter完成的
以下是在 C# 中加密消息的方式:
public void Synch()
{
string messageToSend = "123";
var encryptedData = EncryptString(messageToSend);
var request = new HTTPRequest(new Uri(APIUrl), HTTPMethods.Post, OnRequestFinished);
request.AddField("message", encryptedData);
request.FormUsage = BestHTTP.Forms.HTTPFormUsage.Multipart;
request.Send();
}
public byte[] EncryptBytes(string message)
{
// https://superdry.apphb.com/tools/online-rsa-key-converter
string XML = "<RSAKeyValue><Modulus>vh4OvlS5+7Skk5Nij296rDAKQsxZrz+gV/MInvWqe/SAOlOf8vqs6xJsn7sd523X8m+b0Kd751UbeeDQRGjCmbQc9iwQHUFrNa0bSVnpyoc27K+cuxNdtoPG1XXRCFLKKqVJKSyB5ZPu+oQr+OIo6zYhU5jfCEYbpzPdyYqfDGJPpJv/r8F11MCBrdbvD5Z42ysTDqSxFGIfROWtDOP5ShSNcVGRQYfX3E/v8j+qy0yu2PD/W1UqNd3m6TTkUj/u1XukUMWp+tfXEdEp7IEUaskvGnBfHgJcsBp2c6kT9WxIU0ai4G8mo/2OsHprw42PBWLcJwfUeUgY3itSczniWQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
//get the object back from the stream
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(XML); …Run Code Online (Sandbox Code Playgroud) 我昨天的帖子:https://stackoverflow.com/questions/14296006/phpseclib-sftp-port-number
好的,昨天我开始用php学习SSH/SFTP.我搜索了一堆论坛帖子,并推测我需要下载phpseclib.
相对较新的php因此从php5开始我不知道以前的php4不使用__constructor,因此上面的问题/帖子.
回答是相互矛盾的,然而对于原始问题而言有点偏离主题却让我想到了一个我觉得在继续之前需要回答的问题:
哪个更好用,ssh2 pecl扩展 OR phpseclib?
这个问题:phpseclib vs libssh2是一样的,但我觉得现在有点过时,正如2010年11月5日17:37所问的那样
我正在运行一个脚本,该脚本需要一个未正确包含在我的脚本中的文件。
PHP Fatal error: require_once(): Failed opening required 'Math/BigInteger.php' (include_path='.:/usr/share/php:/usr/share/pear') in /myDir/Net/SSH2.php on line 746
我有一个error_handler设置,它记录了我遇到的每个错误:
function script_error_handler($errno, $errstr, $errfile, $errline){
echo "IN ERROR HANDLER\n";
$GLOBALS['errors'][] = array(
'errno' => $errno,
'errstr' => $errstr,
'errfile' => $errfile,
'errline' => $errline
);
return true;
}
Run Code Online (Sandbox Code Playgroud)
我也有一个shutdown_function它稍后会通过错误来确定成功或失败(除其他外)。该函数的一部分打印我记录的错误。
function shutdown_handler($io) {
print_r($GLOBALS['errors']);
echo "\n";
//irrelevant stuff ommitted
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它的输出如下:
Array
(
[0] => Array
(
[errno] => 2
[errstr] => require_once(Math/BigInteger.php): failed to open stream: No such file or …Run Code Online (Sandbox Code Playgroud) php ×10
phpseclib ×10
sftp ×3
encryption ×2
apache ×1
c# ×1
codeigniter ×1
composer-php ×1
fopen ×1
laravel ×1
libssh2 ×1
ssh ×1