【问题标题】:Proxy script on c++ for linux用于 linux 的 c++ 上的代理脚本
【发布时间】:2018-08-16 10:55:09
【问题描述】:

我有一个代码,可以在 Linux 上启用代理。它应该像这样工作:我正在启动程序,在(“stop”以禁用代理)中写入IP:port,程序写入终端export http_proxy://(entered proxy),如果我输入“stop”,它会写入unset http_proxy .代码如下:

#include <iostream>
using namespace std;

int main(){
char proxy[20];
char choice;
cout << "Enter ip:port ('stop' to disable): ";
cin >> proxy;
if(proxy != "stop"){
cout << "Do you want to use it as ftp(y/n): "
cin >> chioce;
}

if(proxy == "stop"){
system("unset http_proxy");
system("unset ftp_proxy");
}
else if(choice == 'y'){
system("export http_proxy=http:/"+'/'+proxy+'/');
system("export ftp_proxy=http:/"+'/'+proxy+'/');
}
else{
system("export http_proxy=http:/"+'/'+proxy+'/');
}

}

但是当我用 g++ 编译时,我得到了这个错误:

error: invalid operands of types ‘const char*’ and ‘char [20]’ to binary ‘operator+’

这是我第一次使用""+a+""。你能帮帮我吗?

【问题讨论】:

  • 即使您修复了编译错误,您的程序也不会做任何有用的事情,除了在屏幕上打印消息。无论如何,执行的命令都不会产生任何影响。环境变量不能以这种方式工作。你会发现,无论你做什么,你的 shell 的变量都不会设置。

标签: c++ linux terminal proxy g++


【解决方案1】:

您的错误是由于您不能使用+ 来连接字符串文字。您最好的选择是使用std::string 来构建您的字符串。

system(("export http_proxy=http:/"s + '/' + proxy + '/').c_str());

proxy 也应该是std::string。这样您就不必担心要设置什么大小或缓冲区溢出。

另外,正如 Sam Varshavchik 所指出的,这无论如何都不会做你想做的事。 system() 创建一个有自己环境的子进程;一旦通话结束,它就会消失。

【讨论】:

  • 非常感谢你,迈克尔!该程序可以编译,但是正如您和@Sam Varshavchik 所说, system() 不会改变任何东西。所以你知道,我 2 天前开始使用 linux XD。有什么解决方案可以让这个应用正常工作吗?
  • 据我所知,没有便携的方法可以做到这一点。一种常见但依赖于实现的方法是对 main 使用第三种可能的签名。见en.cppreference.com/w/c/language/main_function。我自己从未使用过它,我不确定您是否可以通过这种方式安全地写入环境,但它可能值得探索。
  • 好的,我想我还没有做这样的事情。谢谢!
  • 您错过了此操作所需的 using std::literals::string_literals;
  • @Hazker - 不,一个进程不能正常修改另一个正在运行的进程的环境(存在一些例外,通过ptrace() 等,用于调试)。这是一件好事 - 如果环境变量在运行时可能会发生意外变化,那么推理程序执行将更加困难!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2019-06-14
  • 1970-01-01
相关资源
最近更新 更多