我偶然发现了以前从未在php中使用过的两个函数
set_include_path();
get_include_path();
Run Code Online (Sandbox Code Playgroud)
我目前正在寻找将phpseclib实现到我正在处理的项目上.因为我需要使用SSH2的SFTP类扩展,而后者又需要MathBigInteger类等.等等.
手册说set_include_path():
"在脚本的持续时间内设置include_path配置选项."
这对我的框架的其余部分意味着什么,它会设置来自'phpseclib'目录的所有包含路径吗?
另外,我真的没有得到:
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
Run Code Online (Sandbox Code Playgroud)
我将php sec存储在我的文件系统中的自定义库目录中,get_include_path()有些神奇地找到我的文件系统中的phpseclib目录吗?
正如你所看到的,我完全迷失在这里......有人可以帮我一点点好吗?
PS/I只需要在应用程序的一个partivular点上使用这个库,因此只想在需要时包含它,目前我想将它包含在我的模型类的子代中.
我在我的机器上安装了Apache,因此我可以将localhost用作PHP服务器.这样可行.现在我正在尝试使用PHP通过SFTP将文件发送到另一台服务器.我环顾四周,看到了phpseclib的推荐.我似乎无法弄清楚如何安装phpseclib.以下是该网站提供的内容:
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
include('Net/SFTP.php');
Run Code Online (Sandbox Code Playgroud)
您必须设置包含路径.
我明白这些词是什么意思,但我无法让它发挥作用.我正在使用mac.我的服务器在/Users/diego/Sites/.我到底需要把phpseclib文件夹放在哪里?我需要在我的php文件中添加哪些行以phpseclib包含在内?
我需要确保SMTP服务器证书由公共证书颁发机构签名.我想使用phpseclib或其他一些受信任的库.我相信我可以使用从Firefox中提取的根证书.
这里有一些家庭酿造方法来检查证书日期和其他元数据,但它看起来不像任何签名检查那样(除了确保OpenSSL这样做).无论如何,我想使用一个库 - 我想写尽可能少的证书处理代码,因为我不是一个密码学家.
也就是说,上面链接的答案仍然非常有用,因为它帮助我获取了一些代码来从TLS对话中获取证书:
$url = "tcp://{$domain}:{$port}";
$connection_context_option = [
'ssl' => [
'capture_peer_cert' => true,
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
]
];
$connection_context = stream_context_create($connection_context_option);
$connection_client = stream_socket_client($url, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $connection_context);
stream_set_timeout($connection_client, 2);
fread($connection_client, 10240);
fwrite($connection_client,"HELO alice\r\n");
fread($connection_client, 10240);
fwrite($connection_client, "STARTTLS\r\n");
fread($connection_client, 10240);
$ok = stream_socket_enable_crypto($connection_client, TRUE, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
if ($ok === false)
{
return false;
}
$connection_info = stream_context_get_params($connection_client);
openssl_x509_export($info["options"]["ssl"]["peer_certificate"], $pem_encoded);
Run Code Online (Sandbox Code Playgroud)
(请注意,我已经故意关闭了证书验证.这是因为我无法控制运行的主机,它们的证书可能已经过旧或配置错误.因此,无论连接验证如何,我都希望获取证书我正在使用,然后使用cacert.pem我将提供的内容自行验证.)
那将给我这样的证书.这个是Microsoft的Live.com电子邮件服务器smtp.live.com:587:
-----BEGIN …Run Code Online (Sandbox Code Playgroud) 这是我用phpseclib做的方法(有效):
<?php
include('Crypt/RSA.php');
$rsa = new Crypt_RSA();
$rsa->setPassword('password');
$result = $rsa->loadKey('-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,E3B1C06E0D0C2633
gvmXzl6W7eV1a3N5rQNwBWKY9on3IgxZudS33cip5f88FotsPSDJMvqj6LVw2RxobDjhlOOzqmTb
VrlTnoQ6CogXFZSfiPmixiyyptCUEKJkSiEhYGM5GQm0OoGcLeLbgBb9tRpWh5IlXulKD6XFhx8q
/eGg5a+mSkX1i7kv2+Ih3jHmEKwrnfzhcA29pBF3OQJo+Ks9IYneuk676pHtsIs7CpFKq1tDvD8Q
O7URxnVnHLltaFvIxshqyZu92xbUYZR7YzjXl5+3w4TVgeAHUogEV+H9iZTosD/copUsbQO+78w2
E1D3iDS94wRgx0Tjv4xlwrTpOV38FS5rdL32492DcCRlCYM4VtuwjYeWi5shJg69jCb0EwGRqfAo
xko+lbKWELTuFKwD7n1rc/2fTarbGuf8S2AEggBLZyfXHC/9N84mXLFO2XKq+0WdiEFhQj2Cze+a
9qcSK6tPSrjK1LPlnOOppFgDElZaZ0rxsgjtiWSIAEw/Ad+SIM5u+vqwzF8J317JlsdKoBFDw8mS
MxCMuMksKJ23mgvY+THRIVgH3E7lEDZQzCi1Uy6ldLJcran/6wHwP88pVM2odiHkpnrJGcEBbbIk
qsxJZhFT8aUt/cUEBj3fnP7cxoNLQfTHMPqUTqKBWaVufFzGU9YB1R+XWFULLddwJHnV7gPheBlk
MDapowb+Is77+a9Y2VDsOXEvNpqTY0giiSrckG05IZnrhJ24JnSCwyNd99lm7XKdEGGrjBCMqIyI
Fqox8Ahkv3KWAJPYK1eOCc5d/KwZHlnlFJq7ZYy9u3fEnxQCjOEmeXLkLangKA==
-----END RSA PRIVATE KEY-----');
echo $result ? 'true' : 'false';
?>
Run Code Online (Sandbox Code Playgroud)
但是,为了进行比较,我正在尝试使用OpenSSL.这是我的代码:
<?php
$pkey = openssl_pkey_get_private('-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,E3B1C06E0D0C2633
gvmXzl6W7eV1a3N5rQNwBWKY9on3IgxZudS33cip5f88FotsPSDJMvqj6LVw2RxobDjhlOOzqmTb
VrlTnoQ6CogXFZSfiPmixiyyptCUEKJkSiEhYGM5GQm0OoGcLeLbgBb9tRpWh5IlXulKD6XFhx8q
/eGg5a+mSkX1i7kv2+Ih3jHmEKwrnfzhcA29pBF3OQJo+Ks9IYneuk676pHtsIs7CpFKq1tDvD8Q
O7URxnVnHLltaFvIxshqyZu92xbUYZR7YzjXl5+3w4TVgeAHUogEV+H9iZTosD/copUsbQO+78w2
E1D3iDS94wRgx0Tjv4xlwrTpOV38FS5rdL32492DcCRlCYM4VtuwjYeWi5shJg69jCb0EwGRqfAo
xko+lbKWELTuFKwD7n1rc/2fTarbGuf8S2AEggBLZyfXHC/9N84mXLFO2XKq+0WdiEFhQj2Cze+a
9qcSK6tPSrjK1LPlnOOppFgDElZaZ0rxsgjtiWSIAEw/Ad+SIM5u+vqwzF8J317JlsdKoBFDw8mS
MxCMuMksKJ23mgvY+THRIVgH3E7lEDZQzCi1Uy6ldLJcran/6wHwP88pVM2odiHkpnrJGcEBbbIk
qsxJZhFT8aUt/cUEBj3fnP7cxoNLQfTHMPqUTqKBWaVufFzGU9YB1R+XWFULLddwJHnV7gPheBlk
MDapowb+Is77+a9Y2VDsOXEvNpqTY0giiSrckG05IZnrhJ24JnSCwyNd99lm7XKdEGGrjBCMqIyI
Fqox8Ahkv3KWAJPYK1eOCc5d/KwZHlnlFJq7ZYy9u3fEnxQCjOEmeXLkLangKA==
-----END RSA PRIVATE KEY-----', 'password');
if ($pkey === false) exit('FAILURE');
openssl_pkey_export($pkey, $out_key_file);
echo $out_key_file;
?>
Run Code Online (Sandbox Code Playgroud)
唯一的问题:代码过早死亡,回应失败.即.openssl_pkey_get_private()未加载密钥.openssl_error_string表示"错误:0906D066:PEM例程:PEM_read_bio:错误的结束行".
有任何想法吗?
我在php中有一个web服务,它生成一个用于加密消息的密钥对,以及一个用于检索私钥并解密消息的java应用程序.
对于php我正在使用http://phpseclib.sourceforge.net/并拥有这两个文件:
keypair.php
<?php
set_time_limit(0);
if( file_exists('private.key') )
{
echo file_get_contents('private.key');
}
else
{
include('Crypt/RSA.php');
$rsa = new Crypt_RSA();
$rsa->createKey();
$res = $rsa->createKey();
$privateKey = $res['privatekey'];
$publicKey = $res['publickey'];
file_put_contents('public.key', $publicKey);
file_put_contents('private.key', $privateKey);
}
?>
Run Code Online (Sandbox Code Playgroud)
encrypt.php
<?php
include('Crypt/RSA.php');
//header("Content-type: text/plain");
set_time_limit(0);
$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
$rsa->loadKey(file_get_contents('public.key')); // public key
$plaintext = 'Hello World!';
$ciphertext = $rsa->encrypt($plaintext);
echo base64_encode($ciphertext);
?>
Run Code Online (Sandbox Code Playgroud)
在java中我有这个代码:
package com.example.app;
import java.io.DataInputStream;
import java.net.URL;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
public class MainClass …Run Code Online (Sandbox Code Playgroud) 我知道你可以从任何梨形通道安装包,我有一个基本的梨包
...
"repositories": [
{
"type": "pear",
"url": "http://pear.php.net"
}
],
"require-dev": {
"pear-pear/Mail": "*"
}
...
Run Code Online (Sandbox Code Playgroud)
我要做的是从不同的通道安装依赖项进行测试.
sudo pear channel-discover phpseclib.sourceforge.net
sudo pear install phpseclib/Net_SSH2
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几乎我在composer.json中可以想到的每个配置组合来安装这个包,但它似乎从来没有找到任何东西或工作.
在我的composer.json中,要安装此软件包的正确方法/配置是什么?
假设我有以下代码.
为了测试这一点,我更改了服务器IP以模仿错误消息.以下IP不存在,因此Unhandled Exception消息为:Cannot connect to 10.199.1.7. Error 113. No route to host
这会显示一个带有PHP代码的丑陋屏幕.是否有可能发现此错误?
try {
$ssh = new Net_SSH2('10.199.1.7');
if (!$ssh->login('deploy', $key)) {
throw new Exception("Failed login");
}
} catch (Exception $e) {
???
}
Run Code Online (Sandbox Code Playgroud) 我有一个大文件(200 MB以上).我需要通过PHP cron job转移它.使用Phpseclib会出现以下错误:
/app/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php中允许的内存大小为134217728个字节(尝试分配4133个字节)
有没有办法可以做到这一点PHP cron job?
代码很简单,其中$ localFile是一个已经存在的CSV文件
$sftp->put('/Import/coupons/coupons_import_test.csv', $localFile, NET_SFTP_LOCAL_FILE);
Run Code Online (Sandbox Code Playgroud)
PS.这需要PHP在/tmp文件夹中生成该文件后完成,因此传输脚本的时间必须发挥作用.
[编辑]我不打算增加内存限制,因为以后的文件可能会更大.我可以部分传输文件(附加模式)或使用PHP cron的一些shell脚本的解决方案是值得的
远程服务器上的文件大小为111.4 MB,而本地实际文件大得多.
[修复后编辑]从版本1.0更改为版本2.0.2后问题消失我必须修改put的代码
$sftp->put('/Import/coupons/coupons_import.csv', $localFile, $sftp::SOURCE_LOCAL_FILE);
Run Code Online (Sandbox Code Playgroud) 所以我需要执行一个命令,但是它只会在su到root(或sudo)时运行,但我似乎无法弄清楚如何将su命令发送到root
(我可以使用loginuser罚款登录并执行其他命令)
http://phpseclib.sourceforge.net/ssh/examples.html
我的代码如下
<?php
include('Net/SSH2.php');
$ssh = new Net_SSH2('255.255.255.255',22);
if (!$ssh->login('loginuser', 'fakepassword')) {
exit('Login Failed');
}
echo $ssh->read('[prompt]');
echo $ssh->write("su\n");
echo $ssh->read('Password:');
echo $ssh->write("rootfakepassword");
echo $ssh->read('[prompt]');
echo $ssh->exec('cc get_wireless_status');
?>
Run Code Online (Sandbox Code Playgroud)
我也尝试使用exec命令来做大致相同的事情而没有运气
有什么建议么?
当前版本的代码(无效)
<?php
include('Net/SSH2.php');
$ssh = new Net_SSH2('255.255.99.74',22);
if (!$ssh->login('loginuser', 'password')) {
exit('Login Failed');
}
echo $ssh->read('loginuser@intranet:/home/login >');
$ssh->write("su\n");
echo $ssh->read('Password:');
$ssh->write("rootpassword\n");
echo $ssh->read('intranet:/home/login #');
$ssh->write("cc get_wireless_status\n");
echo $ssh->read('[prompt]');
?>
Run Code Online (Sandbox Code Playgroud)
登录腻子文本
login as: loginuser
loginuser@255.255.99.74's password:
Last login: Thu Feb 14 13:57:16 2013 from infong1045.lxa.perfora.net
Sophos UTM
(C) …Run Code Online (Sandbox Code Playgroud) 我有要上传到SFTP服务器中“传入”文件夹的CSV。我正在使用phpseclib来做到这一点。该连接已经存在,但不输出任何内容。
我不确定自己做的是否正确,因为我之前从未处理过SFTP。这是我的代码:
$file = "leads.csv";
$server = "41.160.150.200";
//$server = "ft.bayport.co.za";
$port = "22";
$username = "";
$password = "";
//username and password removed for security reasons
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
include 'Net/SFTP.php';
define('NET_SFTP_LOGGING', NET_SFTP_LOG_COMPLEX); // or NET_SFTP_LOG_SIMPLE
$sftp = new Net_SFTP($server);
// Check SFTP Connection
if (!$sftp->login($username, $password)) {
echo 'Login Failed.';
echo $sftp->getSFTPLog();
}else{
echo 'Connected to SFTP.';
echo $sftp->pwd();
// Upload CSVs to SFTP incoming folder
echo $upload = $sftp->put("incoming/".$file, "./bayport/".$file, NET_SFTP_LOCAL_FILE);
}
Run Code Online (Sandbox Code Playgroud)
我真的很感谢您的帮助。谢谢!