是否可以在 bash 会话中为所有网络通信指定代理?我怀疑可以使用 ssh 来实现,但如果有更好的方法,我宁愿不使用它。
答案1
在 Linux 中有proxychains
和proxychains-ng
。我相信后者proxychains4
在 Ubuntu 中被调用。用法如下:
proxychains4 some_program # see the manual to learn about config files
或者
proxychains4 -f configfile.conf some_program
是否可以在 bash 会话中为所有网络通信指定代理?
基本上是的。
proxychains4 bash
该工具的工作原理是使用LD_PRELOAD
多变的预加载其共享对象,该对象执行实际工作。首先,bash
本身是代理的(通常您不希望您的 shell 发起网络连接,但 Bash 会为特殊重定向(如)执行此操作foo > /dev/tcp/host/port
,它们将被代理)。变量在环境中,因此在此 Bash 会话中调用的任何命令都将受到影响。
# from within our proxified Bash
wget -O /dev/null superuser.com # also proxified
然而
如果我们的代理 Bash(或任何代理命令)产生了一个
LD_PRELOAD
没有指向正确对象的子进程,那么该子进程将不会被代理,例如:# from within our proxified Bash LD_PRELOAD="" wget -O /dev/null superuser.com # not proxified
如果我们的代理 Bash(或任何代理命令)执行到一个新进程(可能是其自身的新实例)但
LD_PRELOAD
没有指向正确的对象,则生成的进程将不会被代理,例如:# from within our proxified Bash unset LD_PRELOAD exec bash # now we are in non-proxified Bash, it replaced the proxified one wget -O /dev/null superuser.com # not proxified
答案2
telnet
您可以通过将其导出为环境变量来设置大多数支持 SOCKS 的程序(即wget
等)使用的代理:
export http_proxy=http://username:password@proxyhost:port/
export https_proxy=https://username:password@proxyhost:port/
export ftp_proxy=http://username:password@proxyhost:port/