分类: 服务器

服务器

ssh公钥连接linux服务器

1.  生成SSH密钥

ssh-keygen -t rsa -C “10001@qq.com”
会生成rsa和rsa.pub,默认保存在 ~/.ssh/ 目录 ,rsa是私钥,rsa.pub是公钥。

 

2.  服务器端设置

编辑 etc/ssh/sshd_config

去掉以下几行的注释, 开启公钥认证登陆 。

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
AuthorizedKeysCommand none
AuthorizedKeysCommandRunAs nobody
如果需要禁止使用密码登录,可以设置

PasswordAuthentication no
重启ssh

service sshd restart
3.   在.ssh目录创建config文件(设置服务器端口,在连git服务器时)

host 192.168.1.101
user git

PreferredAuthentications publickey
identityfile C:/Users/Administrator/.ssh/admin

hostname 192.168.1.101
port 22
指定连接192.168.1.101的服务器时使用admin私钥进行验证 。

 

4.  上传公钥到服务器

在git  bash里面执行以下命令 :

scp ~/.ssh/admin.pub git@192.168.1.101: ~/
5.  将公钥写入服务器验证文件

以root登陆服务器 ,再切换到git用户 。

在git用户目录建立 .ssh/authorized_keys 文件 。目录和文件都要新建 。

然后执行添加公钥命令

cat id_rsa.pub >> ~/.ssh/authorized_keys
6.  设置文件和目录权限

SSH对公钥、私钥的权限和所有权的要求是非常严格的,总结如下:

1、设置.ssh目录权限

 

$ chmod 700 -R .ssh

2、设置authorized_keys权限

 

$ chmod 600 authorized_keys
要保证.ssh和authorized_keys都只有用户自己有写权限。否则验证无效。

 

7.  ssh公钥验证登陆

输入ssh连服务器命令

ssh git@192.168.1.101
如果显示以下信息 ,表明密钥登陆成功 。

$ ssh  git@192.168.1.101

Last login: Sun Jul  6 22:04:32 2014 from 192.168.1.100

[git@localhost ~]$

SSH公钥登录原理

通常我们使用Xshell登录ssh时,有两种方式:

一、密码口令(类似于账号密码登录)

1.客户端连接上服务器,服务器把公钥发给客户端。

2.客户端用服务器公钥加密,上传密码。

3.服务器用私钥解密,如果匹配,则连接。

二、密钥登录

一般使用RSA公钥私钥技术。

1.生成密钥对。

2.将公钥信息写入目标用户的密钥验证文件。

3.客户端请求登录。

4.服务器发送一段随机字符串,并使用公钥加密。

5.客户端使用私钥解密,并返回解密后的信息。

6.服务器进行信息对比,如果验证成功,则允许连接。
%title插图%num

这就可以解释为什么我用Xshell软件,只有一个私钥文件,却可以登录两台云端服务器的问题

答:(个人理解,有可能是错误的)那两台云端服务器都事先写入公钥信息,该公钥和我的私钥是一个密钥对,因此,理论上只要有N台主机都事先写入我的公钥信息,我就可以连接N台主机。

补充:通常来说,公钥有拓展名,私钥没有拓展名,下图为私钥。公钥应该传到服务器上。

%title插图%num

将公钥放到服务器上,用ssh远程服务器

以root用户为例:
1.先复制ssh-rsa.pub内的公钥内容,有的人可能是由远程连接软件生成的公钥,同样的复制以.pub结尾的公钥的内容

2.登录进入服务器,先备份authorized_keys的内容
cp authorized_keys authorized_keys.bak
然后用vim修改authorized_keys文件,添加自己的公钥
vim /root/.ssh/authorized_keys

3.在远程连接软件选择验证方式为公钥
以SecureCRT为例:
a. 选择公钥,密码不要勾选
%title插图%num

b. 查看公钥属性,将正确的公钥路径放在里面

%title插图%num

4.做完上面的操作就可以创建远程连接,远程服务器了

服务器基础知识

服务器(英文名称server),也称伺服器。指一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器、数据库服务器和应用程序服务器。运行以上软件的计算机或计算机系统也被称为服务器。服务器的构成与一般的PC比较相似,但是服务器在稳定性、安全性、性能等方面都要求更高,因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。
服务器是网络环境中的高性能计算机,它侦听网络上的其他计算机(客户机)提交的服务请求,并提供相应的服务,为此,服务器必须具有承担服务并且保障服务的能力。有时,这两种定义会引起混淆,如域名注册查询的Web服务器。
它的高性能主要体现在高速度的运算能力、长时间的可靠运行、强大的外部数据吞吐能力等方面。服务器的构成与微机基本相似,有处理器、硬盘、内存、系统总线等,它们是针对具体的网络应用特别制定的,因而服务器与微机在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面存在差异很大。一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器(能使用户在其它计算机访问文件),数据库服务器和应用程序服务器。
服务器是网站的灵魂,是打开网站的必要载体,没有服务器的网站用户无法浏览。服务器就像一块敲门砖,就算网站在搜索引擎里的排名再好,网站打不开,用户无法浏览,网站就没有用户体验可言,网站能被打开是*个重点。
服务器软件的定义如前面所述,服务器软件工作在客户端-服务器(C/S)或浏览器-服务器(B/S)的方式,有很多形式的服务器,常用的包括:
文件服务器(File Server) – 如Novell的NetWare
数据库服务器(Database Server) – 如Oracle数据库服务器,MySQL,PostgreSQL,Microsoft SQL Server等
邮件服务器(Mail Server) – Sendmail,Postfix,Qmail,Microsoft Exchange,Lotus Domino等
网页服务器(Web Server) – 如Apache,thttpd,微软的IIS等
FTP服务器(FTP Server) – Pureftpd,Proftpd,WU-ftpd,Serv-U等
域名服务器(DNS Server) – 如Bind9等
应用程序服务器(AP Server) – 如Bea公司的WebLogic,JBoss,Sun的GlassFish
代理服务器(Proxy Server) – 如Squid cache
电脑名称转换服务器 – 如微软的WINS服务器

git 在服务器上使用ssh公钥授权

大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。系统中的每个用户都必须提供一个公钥用于授权,没有的话就要生成一个。生成公钥的过程在所有操作系统上都差不多。 首先先确认一下是否已经有一个公钥了。SSH 公钥默认储存在账户的主目录下的 ~/.ssh 目录。进去看看:

localhost: xxx$ cd ~/.ssh
localhost:.ssh xxx$ ls
github_rsa github_rsa.pub id_rsa id_rsa.pub known_hosts

id_rsa.pub 就是公钥,id_rsa是私钥,如果这个目录根本就没有这些文件可以通过ssh-keygen来创建。

localhost: xxx$ ssh-keygen

通过这个命令确认输出路径并输入密码以及确认密码然后就会生成相应文件,然后把.pub文件的内容提供给git服务器管理员就可以了。

SSH如何通过公钥连接云服务器

通常我们连接远程服务器(linux)windows下通过putty或xshell等工具远程连接。linux下可以直接通过ssh命令连接。其实这两者都是一致的,都是通过ssh协议进行传输。

%title插图%num

如果我们的windows没有安装putty等工具,但是有git-bash的话也可以直接通过ssh来连接。通过以下命令:

ssh root@ip/主机名/域名/
接下来会叫你输入密码,成功输入后即可连接成功。但是这样每一次都要输入面码,我们可以编写一个shell脚本,类似于:conn_vps.sh这样的文件

首先,打开git-bash(桌面上右击,选择Git Bash Here。) $ 为gitbash的命令提示符, # 为注释,非命令不必输入。下同

$ cd ~ # 进入到用户家目录
$ mkdir sh # 新建一个sh目录,用于存放shell脚本。
$ cd sh # 以上都是我的个人习惯。不必和我一样
然后新建该文件

$ vim conn_vps.sh
进入vim模式,按i键即可编辑,输入以下内容:

#!/bin/bash # 这一行必须要写,非注释
ssh root@ip/主机名/域名 # 输入你自己的远程主机ip等
此时按,ESC键,再按:wq保存退出。

现在即可运行该脚本:

$ ./conn_vps.sh
$ sh conn_vps.sh # 这两条命令,任意一条都可以运行
当然如果你在本身就在linux环境下,需要赋予执行权限,像下面这样。和我一样在git-bash中创建的,不需要这一步,本身就有执行权限。

$ chmod 755 conn_vps.sh
然后再执行,然后你会发现依然会输入密码,这是当然的,我们刚才只不过是把刚才的命令简单的脚本了一下。

接下来SSH的密钥分发。

查看是否有密钥

$ ll ~/.shh/ # 查看是否有id.rsa,和id.rsa.pub两个文件。
如果没有的话,可以生成一个。有的话跳过这一步

$ ssh-keygen -t rsa -C “jan.mail@foxmail.com” #这部其实可以不加邮箱参数,但是git配置github连接需要。
#所以*好一次性做了,用一样的密钥。邮箱换成你自己的邮箱。

连续三次回车,如果不设置密码的话。

%title插图%num

接下来,上传公钥到远程服务器

$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@远程服务器的ip/主机名/域名
然后运行conn_vps.sh。*次还是需要输入一遍密码,如果出现以下提示符即算成功。

Now try logging into the machine, with: “ssh ‘root@你的ip'”
and check to make sure that only the key(s) you wanted were added.
这样就算成功了,在运行conn_vps.sh,即可连接上你的服务器。

如何你要多个云服务器。root密码可以弄得复杂些,然后通过这样的方式连接云服务器。yeah!大功告成!嗯,既然我们可以登录上去了,那我们去看看远程机器上(linux)的情况。

输入ll .ssh/

[root@ten ~]# ll .ssh/
total 4
-rw——- 1 root root 401 Sep 10 20:47 authorized_keys
如果你的远程机器上没有生成ssh-keygen,就会只有一个文件,authorized_keys翻译过来就是认证的密钥。而这个认证的密钥就是前面那条命令的的 ~/.ssh/id_rsa.pub 的内容。

%title插图%num

所以这条命令 ssh-copy-id -i ~/.ssh/id_rsa.pub root@远程服务器的ip/主机名/域名就是把id_rsa.pub的内容粘贴到authorized_keys中。如果另一台客户端也想连接到这台远程服务器。可以用同样的命令来一遍,也可以直接用cat查看id_rsa.pub,再在服务端用vim打开authorized_keys文件。粘贴进去,之前的不要删除,换一行即可。

当然如果你不想用ssh-copy-id -i命令,那你就得记住authorized_keys这个单词~

linux下配置公钥私钥

sh 无密码登录要使用公钥与私钥。linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例。

有机器A(192.168.1.155),B(192.168.1.181)。现想A通过ssh免密码登录到B。
首先以root账户登陆为例。

1.在A机下生成公钥/私钥对。

[root@A ~ ]# ssh – keygen – t rsa – P ”

-P表示密码,-P ” 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车。
该命令将在/root/.ssh目录下面产生一对密钥id_rsa和id_rsa.pub。

一般采用的ssh的rsa密钥:
id_rsa 私钥
id_rsa.pub 公钥
下述命令产生不同类型的密钥
ssh-keygen -t dsa
ssh-keygen -t rsa
ssh-keygen -t rsa1

2.把A机下的/root/.ssh/id_rsa.pub 复制到B机的 /root/.ssh/authorized_keys文件里,先要在B机上创建好 /root/.ssh 这个目录,用scp复制。

[root@A ~ ]# scp /root/.ssh/id_rsa.pub root@192.168.1.181:/root/.ssh/authorized_keys
root@ 192.168 . 1.181 ‘ s password:
id_rsa.pub 100 % 223 0.2KB / s 00 : 00

由于还没有免密码登录的,所以要输入一次B机的root密码。

3.authorized_keys的权限要是600!!!

[root@B ~ ]# chmod 600 /root/.ssh / authorized_keys

4.A机登录B机。

[root@A ~ ]# ssh -l root 192.168 . 1.181
The authenticity of host ‘ 192.168.1.181 (192.168.1.181) ‘ can ‘ t be established.
RSA key fingerprint is 00 :a6:a8: 87 :eb:c7: 40 : 10 : 39 :cc:a0:eb: 50 :d9:6a:5b.
Are you sure you want to continue connecting (yes / no)? yes
Warning: Permanently added ‘ 192.168.1.181 ‘ (RSA) to the list of known hosts.
Last login: Thu Jul 3 0 9 : 53 : 18 2008 from root
[root@B ~ ]#

*次登录是时要你输入yes。

现在A机可以无密码登录B机了。

小结:登录的机子可有私钥,被登录的机子要有登录机子的公钥。这个公钥/私钥对一般在私钥宿主机产生。上面是用rsa算法的公钥/私钥对,当然也可以用dsa(对应的文件是id_dsa,id_dsa.pub)

想让A,B机无密码互登录,那B机以上面同样的方式配置即可。

SSH-KeyGen 的用法

假设 A 为客户机器,B为目标机;

要达到的目的:
A机器ssh登录B机器无需输入密码;
加密方式选 rsa|dsa均可以,默认dsa

做法:
1、登录A机器
2、ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub
3、将 .pub 文件复制到B机器的 .ssh 目录, 并 cat id_dsa.pub >> ~/.ssh/authorized_keys
4、大功告成,从A机器登录B机器的目标账户,不再需要密码了;

ssh-keygen做密码验证可以使在向对方机器上ssh ,scp不用使用密码.
具体方法如下:
ssh-keygen -t rsa
然后全部回车,采用默认值.

这样生成了一对密钥,存放在用户目录的~/.ssh下。
将公钥考到对方机器的用户目录下,并拷到~/.ssh/authorized_keys中。

要保证.ssh和authorized_keys都只有用户自己有写权限。否则验证无效。(今天就是遇到这个问题,找了好久问题所在),其实仔细想想,这样做是为了不会出现系统漏洞

注意 *后一定要在客户端和服务器 执行chmod -R 700 .ssh/ 否则配置是不成功的(每次登录都得重新去输入密码的)。

添加ssh公钥的两种方式

将本地端的id_rsa.pub添加到服务端的authorized_keys的两种方式:

 

1、直接操作文件

 

cat ~/.ssh/id_rsa.pub | ssh user@hostname ‘cat >> .ssh/authorized_keys’
 

2、通过命令

 

ssh-copy-id -i id_rsa.pub user@hostname
ssh-copy-id会检测id_rsa私钥文件是否存在,可以touch id_rsa即可。

 

http://www.jianshu.com/p/848e982df6be

怎么把公钥添加到服务器?ssh更方便登录服务器。

每次ssh连接服务器都要 ssh root@10.66.66.66 然后输入密码。很麻烦!把公钥放到服务器上再起个别名,直接ssh test 就好啦。。
1、生成 SSH 公钥
大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。系统中的每个用户都必须提供一个公钥用于授权,没有的话就要生成一个。生成公钥的过程在所有操作系统上都差不多。 首先先确认一下是否已经有一个公钥了。SSH 公钥默认储存在账户的主目录下的 ~/.ssh 目录。进去看看:

$ cd ~/.ssh
$ ls
authorized_keys2 id_rsa known_hosts
config id_rsa.pub
关键是看有没有用 *** 和 ***.pub 来命名的一对文件,这个 *** 通常就是 id_dsa 或 id_rsa。有 .pub 后缀的文件就是公钥,另一个文件则是密钥。假如没有这些文件,或者干脆连 .ssh 目录都没有,可以用 ssh-keygen 来创建。

2、将id_rsa.pub公钥放到服务器上的authorized_keys(/root/.ssh/authorized_keys).
(可以手动复制过去,也可以ssh-copy-id root@10.10.10.10)

3、现在已经可以ssh 10.66.66.66 连接到该服务器。为了操作方便,可以在/.ssh/config中添加配置:
Host fw01

Hostname 10.55.55.55

User root

Host test

HostName 10.66.66.66

User cy

ProxyCommand ssh -q -W %h:%p fw01  # 通过fw01连接10.66.66.66(一般不需要)

 

然后就可以用ssh test 连接服务器

Web服务器工作原理

Web服务器工作原理概述

很多时候我们都想知道,web容器或web服务器(比如Tomcat或者jboss)是怎样工作的?它们是怎样处理来自全世界的http请求的?它们在幕后做了什么动作?Java Servlet API(例如ServletContext,ServletRequest,ServletResponse和Session这些类)在其中扮演了什么角色?这些都是web应用开发者或者想成为web应用开发者的人必须要知道的重要问题或概念。在这篇文章里,我将会尽量给出以上某些问题的答案。请集中精神!

文章章节:

什么是web服务器、应用服务器和web容器?
什么是Servlet?他们有什么作用?
什么是ServletContext?它由谁创建?
ServletRequest和ServletResponse从哪里进入生命周期?
如何管理Session?知道cookie吗?
如何确保线程安全?
什么是web服务器,应用服务器和web容器?

我先讨论web服务器和应用服务器。让我在用一句话大概讲讲:

“在过去它们是有区别的,但是这两个不同的分类慢慢地合并了,而如今在大多在情况下和使用中可以把它们看成一个整体。”

在Mosaic浏览器(通常被认为是*个图形化的web浏览器)和超链接内容的初期,演变出了“web服务器”的新概念,它通过HTTP协议来提供静态页面内容和图片服务。在那个时候,大多数内容都是静态的,并且HTTP 1.0只是一种传送文件的方式。但在不久后web服务器提供了CGI功能。这意味着我们可以为每个web请求启动一个进程来产生动态内容。现在,HTTP协议已经很成熟了并且web服务器变得更加复杂,拥有了像缓存、安全和session管理这些附加功能。随着技术的进一步成熟,我们从Kiva和NetDynamics学会了公司专属的基于Java的服务器端技术。这些技术*终全都融入到我们今天依然在大多数应用开发里使用的JSP中。
%title插图%num

以上是关于web服务器的。现在我们来讨论应用服务器。

在同一时期,应用服务器已经存在并发展很长一段时间了。一些公司为Unix开发了Tuxedo(面向事务的中间件)、TopEnd、Encina等产品,这些产品都是从类似IMS和CICS的主机应用管理和监控环境衍生而来的。大部分的这些产品都指定了“封闭的”产品专用通信协议来互连胖客户机(“fat” client)和服务器。在90年代,这些传统的应用服务器产品开始嵌入HTTP通信功能,刚开始要利用网关来实现。不久后它们之间的界线开始变得模糊了。

同时,web服务器越来越成熟,可以处理更高的负载、更多的并发和拥有更好的特性;应用服务器开始添加越来越多的基于HTTP的通信功能。所有的这些导致了web服务器与应用服务器的界线变得更窄了。

目前,“应用服务器”和“web服务器”之间的界线已经变得模糊不清了。但是人们还把这两个术语区分开来,作为强调使用。

当有人说到“web服务器”时,你通常要把它认为是以HTTP为核心、web UI为向导的应用。当有人说到“应用服务器”时,你可能想到“高负载、企业级特性、事务和队列、多通道通信(HTTP和更多的协议)”。但现在提供这些需求的基本上都是同一个产品。

以上就是关于web服务器和应用服务器的全部内容。现在我们来看看第三个术语,即web容器。

在Java方面,web容器一般是指Servlet容器。Servlet容器是与Java Servlet交互的web容器的组件。web容器负责管理Servlet的生命周期、把URL映射到特定的Servlet、确保URL请求拥有正确的访问权限和更多类似的服务。综合来看,Servlet容器就是用来运行你的Servlet和维护它的生命周期的运行环境。

什么是Servlet?他们有什么作用?

在Java里,Servlet使你能够编写根据请求动态生成内容的服务端组件。事实上,Servlet是一个在javax.servlet包里定义的接口。它为Servlet的生命周期声明了三个基本方法——init()、service()和destroy()。每个Servlet都要实现这些方法(在SDK里定义或者用户定义)并在它们的生命周期的特定时间由服务器来调用这些方法。

类加载器通过懒加载(lazy-loading)或者预加载(eager loading)自动地把Servlet类加载到容器里。每个请求都拥有自己的线程,而一个Servlet对象可以同时为多个线程服务。当Servlet对象不再被使用时,它就会被JVM当做垃圾回收掉。

什么是ServletContext?它由谁创建?

当Servlet容器启动时,它会部署并加载所有的web应用。当web应用被加载时,Servlet容器会一次性为每个应用创建Servlet上下文(ServletContext)并把它保存在内存里。Servlet容器会处理web应用的web.xml文件,并且一次性创建在web.xml里定义的Servlet、Filter和Listener,同样也会把它们保存在内存里。当Servlet容器关闭时,它会卸载所有的web应用和ServletContext,所有的Servlet、Filter和Listner实例都会被销毁。

从Java文档可知,ServletContext定义了一组方法,Servlet使用这些方法来与它的Servlet容器进行通信。例如,用来获取文件的MIME类型、转发请求或者编写日志文件。在web应用的部署文件(deployment descriptor)标明“分布式”的情况下,web应用的每一个虚拟机都拥有一个上下文实例。在这种情况下,不能把Servlet上下文当做共享全局信息的变量(因为它的信息已经不具有全局性了)。可以使用外部资源来代替,比如数据库。

ServletRequest和ServletResponse从哪里进入生命周期?

Servlet容器包含在web服务器中,web服务器监听来自特定端口的HTTP请求,这个端口通常是80。当客户端(使用web浏览器的用户)发送一个HTTP请求时,Servlet容器会创建新的HttpServletRequest和HttpServletResponse对象,并且把它们传递给已经创建的Filter和URL模式与请求URL匹配的Servlet实例的方法,所有的这些都使用同一个线程。

request对象提供了获取HTTP请求的所有信息的入口,比如请求头和请求实体。response对象提供了控制和发送HTTP响应的便利方法,比如设置响应头和响应实体(通常是JSP生成的HTML内容)。当HTTP响应被提交并结束后,request和response对象都会被销毁。

如何管理Session?知道cookie吗?

当客户端*次访问web应用或者*次使用request.getSession()获取HttpSession时,Servlet容器会创建Session,生成一个long类型的唯一ID(你可以使用session.getId()获取它)并把它保存在服务器的内存里。Servlet容器同样会在HTTP响应里设置一个Cookie,cookie的名是JSESSIONID并且cookie的值是session的唯一ID。

根据HTTP cookie规范(正规的web浏览器和web服务器必须遵守的约定),在cookie的有效期间,客户端(web浏览器)之后的请求都要把这个cookie返回给服务器。Servlet容器会利用带有名为JSESSIONID的cookie检测每一个到来的HTTP请求头,并使用cookie的值从服务器内容里获取相关的HttpSession。

HttpSession会一直存活着,除非超过一段时间没使用。你可以在web.xml里设定这个时间段,默认时间段是30分钟。因此,如果客户端已经超过30分钟没有访问web应用的话,Servlet容器就会销毁Session。之后的每一个请求,即使带有特定的cookie,都再也不会访问到同一个Session了。servletcontainer会创建一个新的Session。

另外,在客户端的session cookie拥有一个默认的存活时间,这个时间与浏览器的运行时间相同。因此,当用户关闭浏览器后(所有的标签或者窗口),客户端的Session就会被销毁。重新打开浏览器后,与之前的Session关联的cookie就再也不会被发送出去了。再次使用request.getSession()会返回一个全新的HttpSession并且使用一个全新的session ID来设置cookie。

如何确保线程安全?

你现在应该已经知道所有的请求都在共享Servlet和Filter。这是Java的一个很棒的特性,它是多线程的并且不同的线程(即HTTP请求)可以使用同一个实例。否则,对每一个请求都重新创建一个实体会耗费很多的资源。

你同样要知道,你不应该使用Servlet或者Filter的实例变量来存放任何的请求或者会话范围内的数据。这些数据会被其他Session的所有请求共享。这是非线程安全的!下面的例子说明了这个问题:

public class MyServlet extends HttpServlet

{

private Object thisIsNOTThreadSafe; //Don’t to this

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{

Object thisIsThreadSafe;

thisIsNOTThreadSafe = request.getParameter(“foo”); // BAD!! Shared among all requests!

thisIsThreadSafe = request.getParameter(“foo”); // OK, this is thread safe.

}

}
不要这样做,这会导致软件出bug。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速