修改当前用户的sudo超级用户权限&socks5代理访问网络
- 格式:docx
- 大小:23.82 KB
- 文档页数:12
简述su和sudo命令的用法概述说明以及解释1. 引言1.1 概述引言部分将对文章主题进行概述,简要介绍su和sudo命令以及它们的用法。
su(切换用户)和sudo(以超级用户权限运行命令)是在Linux和Unix操作系统中常用的命令,用于在当前用户登录状态下暂时切换到其他用户或者执行需要管理员权限的任务。
本文将详细说明su和sudo命令的用法、功能差异以及使用场景,并提供相应的示例和最佳实践建议。
1.2 文章结构本文结构如下:2. su命令的用法- 2.1 简介及概述:对su命令进行简单介绍并说明其作用。
- 2.2 用法解释及示例:详细解释su命令如何使用,并提供具体示例加深理解。
- 2.3 安全风险与防范措施:讨论su命令可能存在的安全风险,并提供相应的防范措施。
3. sudo命令的用法- 3.1 简介及概述:对sudo命令进行简单介绍并说明其作用。
- 3.2 用法解释及示例:详细解释sudo命令如何使用,并提供具体示例加深理解。
- 3.3 安全风险与防范措施:讨论sudo命令可能存在的安全风险,并提供相应的防范措施。
4. su命令和sudo命令的区别与联系- 4.1 功能差异分析:对su命令和sudo命令的功能进行比较,明确它们之间的不同点。
- 4.2 使用场景比较:探讨在不同场景下何时使用su命令或sudo命令是更合适的。
- 4.3 最佳实践建议:给出关于su和sudo命令使用的最佳实践建议,以确保系统安全性和效率。
5. 结论在结论部分对文章进行总结,简要概括了解决方案,并强调su和sudo命令在Linux和Unix系统中的重要性及适用性。
通过本文学习,读者将能够充分理解su和sudo命令的用法、区别以及如何避免潜在安全风险。
2. su命令的用法:2.1 简介及概述:su命令是在Unix和类Unix系统上使用的一个命令,用于切换用户身份。
通常情况下,它被管理员或具有特殊权限的用户使用。
su代表super user(超级用户),因此该命令允许普通用户以超级用户的身份执行操作。
linux用户权限的管理在Linux操作系统中,root的权限是最高的,也被称为超级权限的拥有者。
普通用户无法执行的操作,root用户都能完成,所以也被称之为超级管理用户。
在系统中,每个文件、目录和进程,都归属于某一个用户,没有用户许可其它普通用户是无法操作的,但对root除外。
root用户的特权性还表现在root可以超越任何用户和用户组来对文件或目录进行读取、修改或删除(在系统正常的许可范围内);对可执行程序的执行、终止;对硬件设备的添加、创建和移除等;也可以对文件和目录进行属主和权限进行修改,以适合系统管理的需要(因为root是系统中权限最高的特权用户);一、对超级用户和普通用户的理解;1、什么是超级用户;在所有Linux系统中,系统都是通过UID来区分用户权限级别的,而UID为0的用户被系统约定为是具有超级权限。
超级用户具有在系统约定的最高权限满园内操作,所以说超级用户可以完成系统管理的所有工具;我们可以通过/etc/passwd 来查得UID为0的用户是root,而且只有root对应的UID为0,从这一点来看,root用户在系统中是无可替代的至高地位和无限制权限。
root用户在系统中就是超级用户;2、理解 UID 和用户的对应关系当系统默认安装时,系统用户和UID 是一对一的对关系,也就是说一个UID 对应一个用户。
我们知道用户身份是通过UID 来确认的,我们在《用户(user)和用户组(group)配置文件详解》中的UID 的解说中有谈到?UID 是确认用户权限的标识,用户登录系统所处的角色是通过UID 来实现的,而非用户名;把几个用户共用一个UID 是危险的,比如我们把普通用户的UID 改为0,和root 共用一个UID ,这事实上就造成了系统管理权限的混乱。
如果我们想用root权限,可以通过su或sudo来实现;切不可随意让一个用户和root分享同一个UID ;?在系统中,能不能让UID 和用户是一对多的关系?是可以的,比如我们可以把一个UID为0这个值分配给几个用户共同使用,这就是UID 和用户的一对多的关系。
sudo用法一、什么是sudo?sudo是Linux和Unix系统中的一个命令,代表“Super User Do”,用于允许普通用户以超级用户(root)的权限执行特定的命令。
在Linux系统中,root是拥有完全系统控制权的特权用户,有能力执行任何操作。
然而,为了提高系统安全性,通常不建议用户以root权限运行命令。
sudo命令允许用户在需要时获取临时的root权限,从而避免了长时间以root用户身份操作。
二、sudo的基本用法使用sudo命令非常简单,只需在要执行的命令前加上sudo即可。
例如,要以root权限安装一个软件包,可以使用以下命令:sudo apt install package_name在这个例子中,sudo命令给予了普通用户执行apt命令时所需要的root权限。
三、sudo的工作原理sudo命令的工作原理基于sudoers配置文件。
该配置文件决定了哪些用户以及以何种方式可以使用sudo命令。
该文件通常位于/etc/sudoers,只有root用户有权限修改。
sudoers文件使用特定的语法,包括一些关键字和允许执行命令的规则。
以文本编辑器打开sudoers文件时,我们可以看到以下内容的一部分:# User privilege specificationroot ALL=(ALL:ALL) ALL# Members of the admin group may gain root privileges%admin ALL=(ALL) ALL在这个例子中,第一行表示root用户可以以任何用户执行任何命令,第二行表示admin用户组的成员可以以任何用户执行任何命令。
根据需要,可以自行更改、添加和删除规则。
四、使用sudo的注意事项在使用sudo时需要注意以下几点:1. 最小化使用尽量减少使用sudo命令的频率和范围,最小化以root权限执行操作的次数。
这样可以降低系统被滥用的风险,保护系统的安全性。
Linux给普通⽤户加超级⽤户权限的⽅法
问题
假设⽤户名为:ali
如果⽤户名没有超级⽤户权限,当输⼊ sudo + 命令时,系统提⽰:
复制代码代码如下:
ali is not in the sudoers file. This incident will be reported.
解决
1. 进⼊超级⽤户模式。
即输⼊"su",系统会让你输⼊超级⽤户密码,输⼊密码后就进⼊了超级⽤户模式。
2. 添加⽂件的写权限。
复制代码代码如下:
chmod u+w /etc/sudoers
3. 编辑/etc/sudoers⽂件。
即输⼊命令"vim /etc/sudoers",找到这⼀⾏:"root ALL=(ALL) ALL"在起下⾯添加"xxx ALL=(ALL) ALL"(这⾥的xxx是要改的⽤户名),然后保存
复制代码代码如下:
ali ALL=(ALL) ALL
u 这⾥指⽂件所有者
+w 添加可写权限
u+x 指只⽤当前⽤户具有可写权限
4. 撤销⽂件的写权限。
复制代码代码如下:
chmod u-w /etc/sudoers。
sudo的作用sudo是Unix和Linux操作系统下的一个命令,用于执行一些需要超级用户权限的操作。
该命令可以让普通用户以超级用户(root)的身份来执行指定的命令或程序。
sudo的作用主要是为了保护系统的安全,可以让管理员控制哪些用户可以执行特定的命令或程序。
下面将分步骤阐述sudo的作用。
1. 提高用户权限Unix或Linux系统中,每个用户都有一个默认的权限级别,即普通用户(user)的权限级别。
这些用户不能执行需要超级用户权限才能执行的操作。
例如,安装应用程序、停止系统服务等。
这时,需要使用sudo命令以root身份登录,提高权限级别,才能执行这些操作。
2. 控制用户权限sudo可以控制哪些用户可以执行特定的命令或程序。
管理员可以使用sudo来定义哪些用户可以执行哪些命令,以及以何种方式执行。
这种方式比直接把用户提升为root用户更加安全。
管理员可以在sudo 配置文件(/etc/sudoers)中指定哪些用户可以使用sudo,以及他们可以执行哪些操作。
3. 记录用户行为sudo还可以记录用户执行的命令或程序,包括执行时间和执行结果等。
这对于管理员来说非常有用,可以查看用户的行为是合法还是违规。
管理员可以通过审计日志文件查看用户的操作记录,如:sudo.log。
总之,sudo的作用是为了保护系统的安全,提高用户权限,控制用户权限和记录用户行为。
使用sudo命令可以减少系统被攻击或被破坏的可能性,同时保护用户不受恶意软件或非法操作的威胁。
因此,在Linux和Unix系统中,sudo是一个非常重要的命令,管理员应该掌握好它的使用。
darwin操作系统常用的命令
Darwin操作系统是苹果公司开发的一种基于BSD的类Unix操作系统内核。
它是许多苹果产品的基础,包括Mac OS X和iOS。
在Darwin操作系统中,常用的命令包括但不限于以下几个方面:
1. 文件和目录管理:
ls,列出目录内容。
cd,改变当前目录。
pwd,显示当前工作目录的路径。
mkdir,创建新目录。
rm,删除文件或目录。
cp,复制文件或目录。
mv,移动文件或目录。
2. 系统管理:
ps,显示当前进程状态。
top,显示系统资源占用情况。
kill,终止进程。
sudo,以超级用户权限执行命令。
3. 网络管理:
ifconfig,配置网络接口参数。
ping,测试与另一台主机的连通性。
netstat,显示网络状态信息。
ssh,远程登录到另一台计算机。
4. 软件包管理:
brew,包管理工具,用于在Darwin系统上安装软件包。
port,MacPorts软件包管理工具。
这些命令是在Darwin操作系统中经常使用的,它们可以帮助用户进行文件和目录管理、系统管理、网络管理以及软件包管理等操作。
当然,Darwin操作系统还有许多其他命令和功能,这里只是列举了一些常见的命令。
希望这些信息能够帮助你更好地了解Darwin 操作系统的常用命令。
Linux终端命令中的用户权限和安全管理Linux操作系统具有强大的安全性和灵活性,其中一个关键的安全管理方面就是用户权限的控制。
在Linux终端命令中,用户权限和相关管理操作扮演着重要的角色。
本文将重点探讨Linux终端命令中的用户权限和安全管理。
一、用户权限的概念和分类在Linux系统中,每个用户都被授予一定的权限,用于限制其对系统资源和文件的访问。
Linux系统基于以下三个基本的用户权限分类:1. 用户(Owner)权限:指文件或目录的拥有者所拥有的权限。
所有者可以对文件或目录进行读、写和执行操作。
2. 组(Group)权限:指文件或目录所属的组别的成员所拥有的权限。
管理员可以将用户分配到不同的组,并对组的权限进行管理。
3. 其他人(Others)权限:指没有权限分配到文件或目录的用户的权限。
其他人的权限通常被设置为最低权限,限制其对系统资源和文件的访问。
二、Linux终端命令中的用户权限管理在Linux系统中,可以使用以下常用终端命令来管理用户权限:1. chmod:用于修改文件或目录的权限。
通过为文件或目录设置不同的权限组合,可以精确控制用户的文件访问权限。
例如,使用"chmod u+x file.txt"命令可以将文件file.txt的所有者的执行权限设置为可执行。
2. chown:用于更改文件或目录的所有者。
只有超级用户(root)或原始所有者才能更改文件或目录的所有者。
例如,使用"chown user1 file.txt"命令可以将文件file.txt的所有者更改为user1。
3. chgrp:用于更改文件或目录的组别。
与chown类似,只有超级用户或原始所有者才能更改文件或目录的组别。
例如,使用"chgrp group1 file.txt"命令可以将文件file.txt的组别更改为group1。
4. su:用于切换用户身份。
Linux下以其他⽤户⾝份运⾏程序——su、sudo、runuser本⽂综合分析了Linux系统下,如何使⽤runuser命令、su命令和sudo命令以其他⽤户⾝份来运⾏程序,以及这三个命令的运⾏效率⽐较。
⼀、su 命令临时切换⽤户⾝份SU:( Switch user切换⽤户),可让⼀个普通⽤户切换为超级⽤户或其他⽤户,并可临时拥有所切换⽤户的权限,切换时需输⼊欲切换⽤户的密码;也可以让超级⽤户切换为普通⽤户,临时以低权限⾝份处理事务,切换时⽆需输⼊欲切换⽤户的密码。
zai Linux 系统中,有时候普通⽤户有些事情是不能做的,除⾮是 root ⽤户才能做到。
这时就需要⽤ su 命令临时切换到 root ⾝份来做事了。
1、su 的语法su [OPTION选项参数] [⽤户]-, -l, –login切换⽤户时,使环境变量(home,shell,user,logname,path等)和欲切换的⽤户相同、不使⽤则取得⽤户的临时权限,不加载环境变量。
⽤su命令切换⽤户后,可以⽤ exit 命令或快捷键[Ctrl+D]可返回原登录⽤户;-c, –command=COMMAND使⽤ -c 传递单个命令到 shell 中,执⾏命令后,就恢复原来的⽤户⾝份,退出所切换到的⽤户环境;–session-command=COMMAND使⽤ -c 传递单个命令到 shell 中,并且不创建新的会话;-f, –fast通过 -f 参数到 shell (针对 csh 或 tcsh);-m, –preserve-environment不重置环境变量;-s, –shell=SHELL指定执⾏命令的shell;–help显⽰帮助信息;–version显⽰版本信息;2、su 的范例:1 2 3 4 5su-su- rootsu- root -c "ls -l /root"su- oracle -c "ulimit -aHS"su-s /bin/sh-c "/usr/local/nginx/sbin/nginx"3、su 的优缺点su 的确为管理带来⽅便,通过切换到 root 下,能完成所有系统管理⼯具,只要把 root 的密码交给任何⼀个普通⽤户,他都能切换到root 来完成所有的系统管理⼯作。
在macOS终端中如何编辑系统文件作为苹果电脑的操作系统,macOS提供了一个功能强大的终端工具,允许用户通过命令行来执行各种操作。
其中一个重要的功能是编辑系统文件,可以对系统进行个性化的设置和配置。
本文将介绍如何在macOS终端中编辑系统文件。
在开始之前,请确保你具备管理员权限,以便可以对系统文件进行修改。
同时,编辑系统文件具有一定的风险,一旦操作不当可能导致系统故障或数据丢失,请慎重操作并备份重要文件。
下面是在macOS终端中编辑系统文件的步骤:1. 打开终端:在Dock栏或Launchpad中找到“终端”应用程序并打开。
2. 切换到管理员模式:在终端中输入以下命令并按下回车键,输入管理员密码以确认身份。
sudo su3. 定位到系统文件所在目录:使用“cd”命令切换到包含目标系统文件的目录。
例如,如果你要编辑hosts文件,则可以输入以下命令:cd /private/etc4. 查看目录内容:使用“ls”命令可以查看当前目录下的文件和文件夹。
5. 选择编辑器:macOS终端中可以使用多种编辑器来编辑文件,例如vi、nano等。
选择你熟悉的编辑器进行下一步操作。
这里以vi为例。
6. 使用vi编辑文件:输入以下命令以使用vi编辑器打开目标系统文件。
vi 文件名7. 进入编辑模式:vi编辑器默认处于命令模式,需要按下“i”键进入插入模式,才能进行编辑。
此时你可以自由地进行修改和添加内容。
8. 保存和退出:完成编辑后,按下“Esc”键退出插入模式,然后输入“:wq”命令保存文件并退出vi编辑器。
9. 验证更改:你可以使用cat等指令来查看编辑后的系统文件内容是否正确。
10. 恢复备份:如果你在编辑过程中出现了问题,可以使用备份文件来还原系统文件。
备份文件通常在修改前会自动创建,并带有“~”后缀。
例如,如果你编辑的是hosts文件,则可以使用以下命令进行恢复:cp 文件名~ 文件名总结通过以上步骤,我们可以在macOS终端中轻松地编辑系统文件。
获得超级用户权限Linux终端命令sudo的使用方法在Linux操作系统终端中,sudo(superuser do)是一个非常有用的命令。
它允许普通用户以超级用户的身份来执行特定的系统管理任务,而无需完全切换到超级用户账号。
本文将详细介绍sudo的使用方法,以及在Linux终端中利用sudo命令获得超级用户权限的正确步骤。
1. sudo命令的基本语法sudo命令的基本语法如下:sudo <要执行的命令>例如,要查看系统的磁盘使用情况,可以使用以下命令:sudo df -h在执行上述命令时,系统会提示你输入当前用户密码。
输入密码后,sudo会验证你的身份,并且以超级用户权限执行命令。
如需执行多条命令,可以在每个命令前都加上sudo。
2. 配置sudo的权限在默认情况下,sudo命令只允许系统的root用户和具有sudo特权组的用户使用。
如果当前用户不在sudo特权组中,你将无法使用sudo命令。
为了能够使用sudo,你需要具备以下条件之一:- 用户是系统的root用户;- 用户属于sudo特权组。
如果你是系统的root用户,可以直接跳过这一步骤,因为root用户拥有系统中所有的权限。
如果你是一般用户,并且属于sudo特权组,可以通过修改sudo配置文件来调整权限。
运行以下命令以编辑sudo配置文件:sudo visudo该命令会打开一个文本编辑器,其中包含sudo配置文件。
找到以下行:%sudo ALL=(ALL:ALL) ALL在该行之下添加以下内容来添加一个用户到sudo特权组:<你的用户名> ALL=(ALL:ALL) ALL例如,如果你的用户名是john,添加的行应该是:john ALL=(ALL:ALL) ALL保存并退出sudo配置文件。
3. sudo命令的其他用法除了常规的sudo命令外,还有一些其他用法和参数值,可以使sudo在不同情况下更加灵活有效。
以下是一些常见的sudo用法:- 在sudo执行命令时,不要求输入密码:默认情况下,sudo执行命令时会要求输入用户密码。
1》xx is not in the sudoers file问题的解决方案2013-01-22 10:37:54xx is not in the sudoers file 问题解决的两种方案如下。
两种方法执行命令不同而已,原理其实一样方法一:首先利用whereis 命令查找sudoers配置文件的目录(默认会在etc/sudoers)[root@localhost xiaofei]# whereis sudoerssudoers: /etc/sudoers /etc/sudoers.bak/usr/share/man/man5/sudoers.5.gz然后需要su -切换到root用户,更改/etc/sudoers的权限[root@localhost xiaofei]# chmod u+w /etc/sudoers然后就可以利用vi编辑器来把用户添加到sudoers之中:[root@localhost xiaofei]# vi /etc/sudoers然后找到root ALL=(ALL) ALL所在的位置,把所要添加的用户添加到文件之中,下面是添加完的结果:## Allow root to run any commands anywhereroot ALL=(ALL) ALLxiaofei ALL=(ALL) ALL (这一行是添加的内容,xiaofei是用户名)然后需要把sudoers 的写权限去掉:[root@localhost xiaofei]# chmod u-w /etc/sudoers如果不去掉写权限,系统不允许执行suoders文件,运行sudo命令时会出现以下错误:sudo: /etc/sudoers is mode 0640, should be0440 至此,在退出root用户之后就可以利用sudo命令来执行超级用户的权限了。
方法二:首需要切换到root身份$su -(注意有- ,这和su是不同的,在用命令"su"的时候只是切换到root,但没有把root的环境变量传过去,还是当前用户的环境变量,用"su -"命令将环境变量也一起带过去,就象和root登录一样)然后$visudo //切记,此处没有vi和sudo之间没有空格1、移动光标,到最后一行2、按a,进入append模式3、输入your_user_name ALL=(ALL) ALL4、按Esc5、输入“:wq”这样就把自己加入了sudo组,可以使用sudo命令了。
2》通过Socket5代理服务器访问网络的问题时间:2010-11-20 15:39来源:未知作者:admin 点击:次通过Socket5代理服务器访问网络的问题Socks5版本的协议说明参考RFC1928,RFC1929下面简单地罗列程序实现,不涉及详细的协议规范。
首先对于TCP连接,然后再讨论UDP传输。
至于通过socks5的多播通讯,有兴趣可以参考D. Chouinard的文章。
1、TCP:// 建立流套接字SOCKET m_socTCP=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);// 连接到代理服务器int nRet =connect(m_socTCP,(SOCKADDR*)&m_saiProxy,sizeof(m_saiProxy)); // Step 1: 连接代理服务器成功后,马上开始和代理协商,协商报文如下,询问服务器,版本5,是需要验证(0x02)还是不需要验证(0x00)+------+-------------------+------------+|VER | Number of METHODS | METHODS |+------+-------------------+------------+| 0x05 | 0x02 (有两个方法) | 0x00 | 0x02|+------+-------------------+------------+const charreqNego[4]={(char)0x05,(char)0x02,(char)0x00,(char)0x02};nRet = send(m_socTCP,reqNego,4,0);// Setp 2: 代理服务器将返回两个字节的协商结果,接收协商结果fd_set fdread;FD_ZERO(&fdread);FD_SET(m_socTCP,&fdread);// Last param set to NULL for blocking operation. (struct timeval*) if((nRet=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR){r eturn NC_E_PROXY_SELECT_READ|WSAGetLastError();}char resNego[2]={‘\0‘};int nRcvd=0,nCount=0;while(1){if(FD_ISSET(m_socTCP,&fdread)){//接收sock[0]发送来的数据do{nRet = recv(m_socTCP, (char*)resNego+nRcvd, 2-nRcvd,0);if(nRet==SOCKET_ERROR){returnNC_E_PROXY_RECEIVE|WSAGetLastError();}nRcvd += nRet;}while((nRcvd!=2)&&(++nCount<1000));if(nRcvd==2) break;}if(nCount++>=2000){returnNC_E_PROXY_RECEIVE|WSAGetLastError();}}if(resNego[0]!=0x05 || (resNego[1]!=0x00 &&resNego[1]!=0x02)){returnNC_E_PROXY_PROTOCOL_VERSION|WSAGetLastError();};// Step 3: 根据协商结果判断是否需要验证用户,如果是0x02,则需要提供验证,验证部分参考RFC1929if(resNego[1]==0x02){// 需要密码验证char reqAuth[513]={‘\0‘};BYTE byLenUser = (BYTE)strlen(m_szProxyUserName);BYTE byLenPswd = (BYTE)strlen(m_szProxyPassword);reqAuth[0]=0x01;reqAuth[1]=byLenUser;sprintf(&reqAuth[2],"%s",m_szProxyUserName);reqAuth[2+byLenUser]=byLenPswd;sprintf(&reqAuth[3+byLenUser],"%s",m_szProxyPassword);//Send authentication infoint len = (int)byLenUser + (int)byLenPswd + 3;nRet=send(m_socTCP,(const char*)reqAuth,len,0);if (nRet==SOCKET_ERROR){returnNC_E_PROXY_SEND|WSAGetLastError();}//Now : Response to the auth requestchar resAuth[2]={‘\0‘};int nRcvd=0,nCount=0;do{nRet = recv(m_socTCP,resAuth+nRcvd,2-nRcvd,0);if(nRet==SOCKET_ERROR){returnNC_E_PROXY_RECEIVE|WSAGetLastError();}nRcvd += nRet;}while((nRcvd!=2)&&(++nCount<1000));if(nCount>=1000){returnNC_E_PROXY_RECEIVE|WSAGetLastError();}if (resAuth[1]!=0) return NC_E_PROXY_AUTHORIZE;// 密码验证通过了}// Step 4: 协商完成,开始发送连接远程服务器请求,请求报文格式如下:+----+-----+-------+------+----------+----------+|VER | CMD |RSV| ATYP | DST.ADDR | DST.PORT |+----+-----+-------+------+----------+----------+| 1| 1 | 0x00 | 1| Variable |2|+----+-----+-------+------+----------+----------+// CMD==0x01 表示连接, ATYP==0x01表示采用IPV4格式地址,DST.ADDR是远程服务器地址,DST.PORT是远程服务器端口// 如果需要接受外来连接,则需要在连接完成之后,发送CMD==0x02绑定请求,代理将为此请求绑定一个套接字接受外部连接charreqSubNego[10]={(char)0x05,(char)0x01,(char)0x00,(char)0x01,(c har)0x00,(char)0x00,(char)0x00,(char)0x00,(char)0x00,(char)0x00 };*(unsigned long*)&reqSubNego[4]=m_saiServerTCP.sin_addr.S_un.S_addr;*(unsigned short*)&reqSubNego[8]=m_saiServerTCP.sin_port; nRet=send(m_socTCP,(const char*)reqSubNego,10,0);if (nRet==SOCKET_ERROR){returnNC_E_PROXY_SEND|WSAGetLastError();}// Step 5: 接收对请求的响应,响应包格式如下+----+-----+-------+------+----------+----------+|VER | REP |RSV| ATYP | BND.ADDR | BND.PORT |+----+-----+-------+------+----------+----------+| 1|1| 0x00 | 1 | Variable | 2 |+----+-----+-------+------+----------+----------+// VER 必须是0x05, REP==0x00表示成功,ATYP==0x01表示地址是IPV4地址,BND.ADDR 是代理为连接远程服务器绑定的地址,BND.PORT是这个套接字的端口char resSubNego1[5]={‘\0‘};if(FD_ISSET(m_socTCP,&fdread)){int nRcvd=0,nCount=0;do{nRet = recv(m_socTCP,resSubNego1+nRcvd,5-nRcvd,0);if(nRet==SOCKET_ERROR){returnNC_E_PROXY_RECEIVE|WSAGetLastError();}nRcvd += nRet;}while((nRcvd!=5)&&(++nCount<1000));if(nCount>=1000){returnNC_E_PROXY_RECEIVE|WSAGetLastError();}if(resSubNego1[0]!=0x05||resSubNego1[1]!=0x00){returnNC_E_PROXY_PROTOCOL_VERSION_SUB|WSAGetLastError();}; switch(resSubNego1[3]){case 0x01:{// IP V4char resSubNego2[6]={resSubNego1[4],0};int nRet=-1;if(FD_ISSET(m_socTCP,&fdread)){int nRcvd=0,nCount=0;do{int nRet = recv(m_socTCP,&resSubNego2[1]+nRcvd,5-nRcvd,0);if(nRet==SOCKET_ERROR){returnNC_E_PROXY_RECEIVE|WSAGetLastError();}nRcvd += nRet;}while((nRcvd!=5)&&(++nCount<1000));if(nCount>=1000){returnNC_E_PROXY_RECEIVE|WSAGetLastError();}}// 得到代理绑定地址unsigned long ulBINDAddr = *(unsigned long*)&resSubNego2; // SOCKS BIND ADDRunsigned short usBINDPort = *(unsigned short*)&resSubNego2[4]; // SOCKS BIND PORTm_saiProxyBindTCP.sin_addr.S_un.S_addr=ulBINDAddr;m_saiProxyBindTCP.sin_port=usBINDPort;// 得到本机绑定地址int len = sizeof(m_saiHostTCP);getsockname(m_socTCP,(SOCKADDR*)&m_saiHostTCP,&len);}break;case 0x03:{// Domain nameint nLen = resSubNego1[4]+2;char* presSubNego2 = new char[nLen];if(FD_ISSET(m_socTCP,&fdread)){int nRet=0,nRcvd=0,nCount=0;do{nRet = recv(m_socTCP,presSubNego2+nRcvd,nLen-nRcvd,0);if(nRet==SOCKET_ERROR){returnNC_E_PROXY_RECEIVE|WSAGetLastError();}nRcvd += nRet;}while((nRcvd!=nLen)&&(++nCount<1000));if(nCount>=1000){returnNC_E_PROXY_RECEIVE|WSAGetLastError();}}unsigned short usBINDPort = *(unsignedshort*)(presSubNego2+nLen-2); // BIND PORT;// 此时得到的是远程主机的Domain Namedelete[] presSubNego2; presSubNego2=NULL;}break;case 0x04:{// IPV6AfxMessageBox("该版本不支持IPV6";}break;default:break;}// 至此,连接已经建立。