好的,所以通过ftp或sftp从你自己访问其他服务器......我写了一个小类来处理它.它显然是新的,可以很容易地改进,所以我想把它扔出去看看其他人认为(stackoverflow得到了很多观点,所以希望这可以帮助其他人),以及他们如何改进它...所以我想问题是......如何改进?
class ftp_sftp{
//determine, if ssh, to use phpseclib or php's inbuilt ssh_sftp 'libssh'
public $ssh_type = 'phpseclib';
//set ths path to the directory containing the entire phpseclib files
public $phpseclib_path = 'scripts/phpseclib0.3.0';
//private vars generated by this class
public $host;
public $username;
public $password;
public $connection_type;
public $port_number;
public $connection = false;
//contruct method which will attempt to set the connection details and automatically attempt to establisha connection to the server
public function __construct( $host, $username, $password, $connection_type, $port_number …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)
我真的很感谢您的帮助。谢谢!
我有一个用PHP编写的程序,它将文件分发到各种FTP站点.最近,我使用phpseclib添加了SFTP支持.它非常易于登录和上传文件.
但是,似乎没有明确的功能来关闭连接.这对我很重要,因为我正在处理在处理过程中连接/断开多个站点.
如何关闭Net_SFTP连接?
我有一个难以理解的问题.
我正在尝试自动登录到路由器的CLI并运行通过网页获得的一些命令.但是我不知道路由器是否启用了telnet或SSH(可能是一个,另一个或两者),我有一个可能的用户名/密码组合列表,我需要尝试获取访问权限.
哦,我无法更改协议类型或设备上的凭据,因此这不是一个真正的选择.
我能够弄清楚如何使用已知的协议和登录凭据登录到路由器并运行必要的命令(包含在下面),但我不知道是否应该使用if/else块来处理telnet/ssh决定,或者如果switch语句可能更好?在PHP中使用Expect是一种更简单的方法吗?
function tunnelRun($commands,$user,$pass, $yubi){
$cpeIP = "1.2.3.4";
$commands_explode = explode("\n", $commands);
$screenOut = "";
$ssh = new Net_SSH2('router_jumphost');
if (!$ssh->login($user, $pass . $yubi)) {
exit('Login Failed');
}
$ssh->setTimeout(2);
$ssh->write("ssh -l username $cpeIP\n");
$ssh->read("assword:");
$ssh->write("password\n");
$ssh->read("#");
$ssh->write("\n");
$cpePrompt = $ssh->read('/.*[#|>]/', NET_SSH2_READ_REGEX);
$cpePrompt = str_replace("\n", '', trim($cpePrompt));
$ssh->write("config t\n");
foreach ($commands_explode as $i) {
$ssh->write("$i\n"); // note the "\n"
$ssh->setTimeout(2);
$screenOut .= $ssh->read();
}
$ssh->write("end\n");
$ssh->read($cpePrompt);
$ssh->write("exit\n");
echo "Router Update completed! Results below:<br><br>";
echo "<div id=\"text_out\"><textarea style=\" border:none; width: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Vagrant VM 中运行一个 PHP 文件,该 VM 也使用 Composer 进行构建。
我收到以下错误:
PHP Warning: require(/var/www/CLIENT/vendor/composer/../phpseclib/phpseclib/phpseclib/bootstrap.php): failed to open stream: No such file or directory in /var/www/ispe/vendor/composer/autoload_real.php on line 66
Warning: require(/var/www/CLIENT/vendor/composer/../phpseclib/phpseclib/phpseclib/bootstrap.php): failed to open stream: No such file or directory in /var/www/CLIENT/vendor/composer/autoload_real.php on line 66
PHP Fatal error: require(): Failed opening required '/var/www/CLIENT/vendor/composer/../phpseclib/phpseclib/phpseclib/bootstrap.php' (include_path='.:/usr/share/php') in /var/www/CLIENT/vendor/composer/autoload_real.php on line 66
Fatal error: require(): Failed opening required '/var/www/CLIENT/vendor/composer/../phpseclib/phpseclib/phpseclib/bootstrap.php' (include_path='.:/usr/share/php') in /var/www/CLIENT/vendor/composer/autoload_real.php on line 66
Run Code Online (Sandbox Code Playgroud)
现在,据我所知,此特定功能或其他任何功能都不需要 phpseclib(尽管我还没有 100% 确认其他任何功能)。
即便如此,我还是决定将它添加到我的 composer.json ("phpseclib/phpseclib": "2.0.4") 以摆脱错误,但没有运气。 …
我正在尝试将文件从我的php服务器上传到其他服务器(我的工作场所非常蹩脚,可以阻止ssh流量)
无论如何,这是我正在尝试做的事情:( at:/public_html/manage.php
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib/phpseclib');
include('Net/SSH2.php');
include('Net/SFTP.php');
$ssh = new Net_SSH2('SomeServer',22); //starting the ssh connection to localhost
if (!$ssh->login('root', '12345')) { //if you can't log on...
exit('ssh Login Failed');
}
$sftp = new Net_SFTP('SomeServer',22);
if (!$sftp->login('root', '12345')) { //if you can't log on...
exit('sftp Login Failed');
}
echo $sftp->pwd();
$output = $sftp->put('/root/1_yum_stuff.sh', '1_yum_stuff.txt');
echo $output;
$output = $ssh->exec('ls -a');
//$output = $ssh->exec('./1_yum_stuff.sh & 1>1.txt');
echo $output;
$output = $ssh->exec('pwd');
echo $output;
echo("3rd try!");
?>
Run Code Online (Sandbox Code Playgroud)
问题是,文件"1_yum_stuff.txt"位于我的php服务器上的/ public_html …
我想通过使用upload/ download文件.在看起来非常有前途.sftpphpphpseclib-library
我将我的conposer.json改为:
{
"require": {
"nicolab/php-ftp-client":"*",
"php-curl-class/php-curl-class":"*",
"phpseclib/phpseclib":"*"
}
}
Run Code Online (Sandbox Code Playgroud)
然后我更新了我的目录.Composer将库安装在vendor文件夹中.
问题是我无法创建新的SFTP-Object.
Fatal error: Class 'SFTP' not found in...
Run Code Online (Sandbox Code Playgroud)
我也尝试NET_SFTP过类名,但这也不起作用.有一点我不明白为什么在它上面,它声明classname是NET_SFTP在源中明确调用的SFTP.
自动加载似乎不起作用.
我添加echo "testline";到库中以查看文件是否已加载.如果我使用自动加载,没有任何反应.如果我手动包含该文件,"testline"则打印但仍未找到该类.
例一
<?php
include '/vendor/autoload.php';
$sftp = new SFTP('domain');
if (!$sftp->login('user', 'pass')) {
exit('Login Failed');
}
Run Code Online (Sandbox Code Playgroud)
- >没有回音
示例二:
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib/phpseclib');
include('Net/SSH2.php');
include('Net/SFTP.php');
$sftp = new SFTP('www.domain.tld'); …Run Code Online (Sandbox Code Playgroud) 我想使用 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 7.2中不再支持mcrypt_encrypt,因此我正在尝试完全替换此函数.
在阅读了许多SO答案后,我发现以下代码使用了PHPSECLIB,但它并没有像mcrypt那样生成确切的加密文本.
function encryptRJ256($key,$iv,$string_to_encrypt)
{
// $rtn = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string_to_encrypt, MCRYPT_MODE_CBC, $iv);
$rijndael = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CBC);
$rijndael->setKey($key);
$rijndael->setIV($iv);
$rijndael->setKeyLength(256);
$rijndael->disablePadding();
$rijndael->setBlockLength(256);
$rtn = $rijndael->encrypt($string_to_encrypt);
$rtn = base64_encode($rtn);
return($rtn);
}
Run Code Online (Sandbox Code Playgroud)
我的钥匙和IV是
$ky = 'lkirwf897+22#bbtrm8814z5qq=498j5';
$iv = '741952hheeyy66#cs!9hjv887mxx7@8y';
Run Code Online (Sandbox Code Playgroud)
前42个字符是相同的,但其余的是不同的,你可以看到
要加密的文本:57F0-ECD3-1A3B-341E-BA39-F81B-F020-0DE0
mcrypt_encrypt输出:
3uw7mVZthiIPPNosvppZHd1jEau3Ul + 0BQ4AVS2t80skauq3Zv9z5uztvmiBpYqQcKGIDP5YHfdEBhPBfdVbxg ==phpseclib输出:
3uw7mVZthiIPPNosvppZHd1jEau3Ul + 0BQ4AVS2t80tKnjjxVhuAwh3E1S5OnH1up5AujvQu1Grgyv16tNIEDw ==
我需要生成相同的加密文本,因为这个文本由另一个我无法更改的程序解密.
所以我的问题是,是否可以使用phpseclib或任何其他方式生成与mcrypt_encrypt相同的加密文本?