Centos 7 运维

要在CentOS 7上创建具有root权限的新用户,您可以按照以下步骤操作:

  1. 以root用户身份登录到CentOS 7服务器。
  2. 使用adduser命令创建新用户。将<username>替换为所需的用户名。
1
adduser <username>
  1. 为新用户设置密码。
1
passwd <username>
  1. 将新用户添加到wheel组以赋予他们sudo(root)权限。
1
usermod -aG wheel <username>
  1. 验证新用户是否已添加到wheel组。
1
groups <username>
  1. 编辑sudoers文件以允许wheel组的成员使用sudo执行命令。
1
visudo

通过删除以下行开始的#取消注释:

1
%wheel ALL=(ALL) ALL
  1. 保存并退出sudoers文件。

  2. 现在新用户应该在CentOS 7上具有root权限。您可以使用su命令切换到新用户:

1
su - <username>

请确保仔细遵循这些步骤,并将<username>替换为您要创建的实际用户名。如果需要进一步帮助,请告诉我。

Linux 新建的帐号开启远程登录

要让新创建的Linux帐号可以远程登录,您需要按照以下步骤进行设置:

  1. 确保您的Linux系统上已经安装了SSH服务。如果没有安装,可以使用以下命令进行安装:

    1
    2
    sudo apt install openssh-server     # 对于Debian/Ubuntu系统
    sudo yum install openssh-server # 对于CentOS/RHEL系统
  2. 在新创建的帐号上设置密码,执行以下命令:

    1
    sudo passwd 新帐号的用户名

    您将被要求输入并确认该帐号的密码。

  3. 使用sshd_config文件来配置允许新帐号通过SSH远程登录。编辑/etc/ssh/sshd_config文件,找到以下行:

    1
    AllowUsers 用户名

    如果没有 AllowUsers 行,请添加以下行:

    1
    AllowUsers 新帐号的用户名

    保存并关闭文件。

  4. 重启SSH服务,使修改生效:

    1
    sudo systemctl restart sshd

现在,您的新创建的Linux帐号就可以通过SSH远程登录到系统了。您可以使用SSH客户端连接到系统,并使用新帐号用户名和密码进行身份验证。

怎么查看系统里面已创建的账号

要查看Linux系统中已创建的帐号,您可以使用以下命令来列出系统中所有的帐号:

1
cat /etc/passwd | cut -d: -f1

该命令会读取/etc/passwd文件并列出其中的所有帐号。每个帐号的信息会以冒号分隔的字段形式给出,其中第一个字段是帐号的用户名。

另外,您也可以使用以下命令查看已激活的用户帐号:

1
cut -d: -f1 /etc/passwd

如果您希望进一步了解某个特定的用户帐号的详细信息,可以使用id命令来查看:

1
id 用户名

这些命令可以帮助您查看系统中已创建的用户帐号信息。

怎么查看本机IP

要查看本机的IP地址,您可以使用以下命令:

  1. 使用 ifconfig 命令(在新版本的 Linux 发行版中可能已经被弃用,可以使用 ip addr 命令代替):

    1
    ifconfig

    或者

    1
    ip addr

    在输出中,找到和您连接互联网的网络接口,通常是 eth0wlan0,并查看接口的 inet 地址,即为本机的IP地址。

  2. 使用 hostname 命令来查看本机的主机名及相关信息,包括IP地址:

    1
    hostname -I

    这将显示本机的IP地址。

  3. 可以使用 ipconfig 命令来查看本机的网络配置信息:

    1
    ipconfig

    或者

    1
    ip addr show

    这些命令将显示本机的IP地址。

以上是在Linux系统中查看本机IP地址的几种常用方法。

MySql查询用户权限

要查看 MySQL 中各个账户的权限,可以执行以下步骤:

  1. 连接到 MySQL 数据库服务器

    1
    mysql -u root -p
  2. 查看所有用户的权限

    1
    SELECT User, Host, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, Event_priv, Trigger_priv, Create_tablespace_priv FROM mysql.user;

    以上查询语句将列出所有用户及其对应的权限。您可以根据实际需求选择查看的权限。

  3. 查看特定用户的权限

    如果您只想查看特定用户的权限,可以使用类似以下查询语句:

    1
    SELECT * FROM mysql.user WHERE User = 'username';

    请将 'username' 替换为您要查看的用户名。

通过以上步骤,您可以查看 MySQL 中各个账户的权限情况。如果您需要进一步帮助或有其他问题,请随时告诉我。

MySql添加用户

添加 MySQL 用户通常涉及创建一个新用户并为其分配相应的权限。以下是在 MySQL 中添加用户的一般步骤:

  1. 连接到 MySQL 数据库服务器:
1
mysql -u root -p
  1. 创建一个新用户并分配密码:
1
CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password';

请将 ‘new_user’ 替换为新用户的用户名,而 ‘password’ 则替换为用户的密码。如果想让用户可以从任何位置连接到数据库,可以将 ‘@localhost’ 替换为 ‘%’。

  1. 为用户分配相应的权限,例如,授予用户在特定数据库的所有权限:
1
GRANT ALL PRIVILEGES ON database_name.* TO 'new_user'@'localhost';

请将 ‘database_name’ 替换为用户将被授权访问的数据库名称。

  1. 刷新权限以使更改生效:
1
FLUSH PRIVILEGES;

通过以上步骤,您可以在 MySQL 中成功添加新用户。如果您有任何疑问或需要进一步协助,请随时告诉我。

Centos7 禁用root远程登录

要在CentOS 7上禁用root用户的远程登录,您可以按照以下步骤操作:

  1. 以已有具有sudo权限的用户登录到CentOS 7服务器。

  2. 编辑SSH配置文件/etc/ssh/sshd_config。您可以使用文本编辑器(如vinano)打开文件进行编辑。

  3. 寻找以下行:

1
#PermitRootLogin yes
  1. 将该行修改为:
1
PermitRootLogin no
  1. 保存修改并关闭文件。

  2. 重新加载SSH服务以使更改生效。您可以使用以下命令重新启动SSH服务:

1
sudo systemctl restart sshd

现在,root用户的远程登录已被禁用。如果您需要通过SSH访问服务器,请使用其他有sudo权限的用户登录,然后可以使用su - root切换到root用户执行需要特权的操作。

请牢记,禁用root远程登录有助于增加服务器的安全性,因为攻击者必须先破解普通用户的密码才能尝试登录为root。如果您有任何疑问或需要进一步协助,请告诉我。

Centos 7 yum 安装nginx

要在Centos 7上使用yum安装nginx,您可以按照以下步骤操作:

  1. 打开终端或SSH连接到您的Centos 7服务器。
  2. 确保您具有sudo权限或root权限。
  3. 运行以下命令更新yum包管理器的软件包索引:
1
sudo yum update
  1. 运行以下命令安装nginx:
1
sudo yum install nginx
  1. 确认安装过程中会提示您是否要继续安装nginx,输入’y’并按Enter继续安装。
  2. 安装完成后,启动nginx服务并设置它在系统引导时自动启动:
1
2
sudo systemctl start nginx
sudo systemctl enable nginx
  1. 检查nginx服务是否正在运行:
1
sudo systemctl status nginx
  1. 确保防火墙允许HTTP和HTTPS流量通过。如果防火墙已启用,可以运行以下命令:
1
2
3
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

现在,您已经成功在Centos 7上使用yum安装了nginx。您可以通过访问服务器的IP地址或域名来验证nginx是否已成功安装并正常运行。

MySql给账户所有权限

要为 MySQL 中的 root 用户授予所有权限,可以按照以下步骤进行:

  1. 连接到 MySQL 数据库服务器

    1
    mysql -u root -p
  2. 授予 root 用户所有权限

    1
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;

    请注意,上述命令中的 localhost 可能需要根据实际情况进行修改。如果 root 用户需要从特定主机或 IP 地址访问,则应相应更改为该主机或 IP 地址。

  3. 刷新权限以使更改生效

    1
    FLUSH PRIVILEGES;

通过以上步骤,您可以为 root 用户授予 MySQL 中的所有权限。请谨慎授予权限,避免给予过多权限以确保数据库的安全性。

如果您需要进一步帮助或有其他问题,请随时告诉我。

禁用 MySQL 的 root 用户

禁用 MySQL 的 root 用户通常通过修改该用户的权限或者删除该用户来实现。以下是禁用 MySQL root 用户的一般步骤:

  1. 连接到 MySQL 数据库服务器:
1
mysql -u root -p
  1. 禁用 Root 用户的远程登录权限:

    1
    REVOKE ALL PRIVILEGES ON *.* FROM 'root'@'%';
  2. 删除 Root 用户远程登录权限:

    1
    DELETE FROM mysql.user WHERE User = 'root' AND Host = '%';
  3. 刷新权限以使更改生效:

    1
    FLUSH PRIVILEGES;

请注意,执行这些步骤之前,请务必创建一个具有足够权限的备份用户,在禁用 root 用户之前,确保你能够访问到数据库。

希望这些步骤能帮助到你。如果你有任何疑问或者需要进一步的帮助,请随时告诉我。

.Net点选验证码实现思路分享

哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个。
先上效果图
2019-05-22-14-55-15
如果你被这个效果吸引了就请继续看下去。

贴代码前先说点思路:

1.要有一个汉字库,并按字形分类。(我在数据库里是安部首分类的)

2.获取验证码(也就是取几个文字做验证码)

3.根据取出来的文字去找形近字

4.排列验证码文字和形近字

5.绘制图片

6.显示

6.写个博客分享一下(分享代码改变世界)

获取字库

  我国文化博大精深,辣么多的字从哪儿来?当然我不可能手动加进去,于是我就在网上随便找了一个能查汉字的网站,去抓别人的数据。抓数据的方法请点传送门。传送门里说的只是思路,如果有不明白的请艾特我。我会在下面共享我的字库。

获取验证码

这个就比较简单了这里我就直接贴代码了,下面的代码就是随机排序后取4条数据,我这样写是为了图方便。个人觉得先随机生成ID,然后直接根据ID取数据,这样查询速度会比下面这种写法快。(注意我用的数据库是MySql)

1
2
3
4
5
6
7
8
9
10
11
/// <summary>
/// 获取验证码
/// </summary>
public List<VerificationCode.Model.WenZhi> GetCodeText()
{
const string sql = "SELECT * FROM wenzhi ORDER BY RAND() LIMIT 4";
var dataReader = dbHelper.GetDataReader(sql);
var list = DataReaderToList(dataReader);
dataReader.Close();
return list;
}

根据取出来的文字去找形近字

  因为第一步的时候我存部首了,所以这里我直接根据部首取获取当前部首的形近字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// <summary>
/// 获取答案备选
/// </summary>
/// <param name="buShouCode">部首编码</param>
/// <param name="id">当前文字ID</param>
/// <param name="number">数量</param>
/// <returns></returns>
public List<VerificationCode.Model.WenZhi> GetAnswer(string buShouCode, int id,int number=1)
{
string sql = $"SELECT * FROM wenzhi where BuShouCode='{buShouCode}' and ID <> {id} ORDER BY RAND() LIMIT "+ number;
var dataReader = dbHelper.GetDataReader(sql);
var list = DataReaderToList(dataReader);
dataReader.Close();
return list;
}

排列验证码文字和形近字

  下面的代码是先把备选答案和验证码放在一个集合里然后再对集合排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public Model.Code GetCode()
{

var wenzlist = _wenZhiDal.GetCodeText(); //获取验证码
var listAnsuwr = new List<Answer>();//实例化备选答案对象
var answerCode = string.Empty;//答案
var result = new Model.Code
{
Id = Guid.NewGuid().ToString()
};
//根据验证码获取备选答案并把添加到答案添加到备选答案集合
foreach (var item in wenzlist)
{
answerCode += item.ID + ",";
result.AnswerValue += item.Text;
var answerList = _wenZhiDal.GetAnswer(item.BuShouCode, item.ID);
listAnsuwr.Add(new Answer { Id = item.ID.ToString(), Img = GetImage(item.Text) });
listAnsuwr.AddRange(answerList.Select(answer => new Answer { Id = answer.ID.ToString(), Img = GetImage(answer.Text) }));
}
//如果答案个数不够就再去取几个
if (listAnsuwr.Count < 9)
{
var ran = new Random();
var randKey = ran.Next(0, 4);
var item = wenzlist[randKey];
var answerList = _wenZhiDal.GetAnswer(item.BuShouCode, item.ID, 9 - listAnsuwr.Count);
listAnsuwr.AddRange(answerList.Select(answer => new Answer { Id = answer.ID.ToString(), Img = GetImage(answer.Text) }));
}
result.CodeImg = GetImage(result.AnswerValue);//获取图片
result.AnswerValue = answerCode.TrimEnd(',');
result.Answer = RandomSortList(listAnsuwr);//打乱正确答案与形近字的顺序
return result;
}

这是对集合排序的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// <summary>
/// 随机排列集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listT"></param>
/// <returns></returns>
private static List<T> RandomSortList<T>(IEnumerable<T> listT)
{
var random = new Random();
var newList = new List<T>();
foreach (var item in listT)
{
newList.Insert(random.Next(newList.Count + 1), item);
}
return newList;
}

绘制图片

下面是画图的代码,验证码和备选答案对应两种不同的画法(里面注释写的还算清楚)。不要担心文字旋转x°后人类分不出来,哈哈。代码最后一句我把图片转成了Base64,方便前端调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
private static string GetImage(string text)
{
Image image;
switch (text.Length)
{
case 1:
image = new Bitmap(50, 40);
break;
case 4:
image = new Bitmap(120, 40);
break;
default:
image = new Bitmap(50, 40);
break;
}
Brush brushText = new SolidBrush(Color.FromArgb(255, 0, 0, 0));
var graphics = Graphics.FromImage(image);
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.Clear(Color.White);
var font = new Font(new FontFamily("华文彩云"), 20, FontStyle.Regular);
if (text.Length > 1)//画验证码
{
//先来两条直线做干扰 然后再画文字
graphics.DrawLine(new Pen(brushText, new Random().Next(1, 3)), new Point(new Random().Next(0, 10), new Random().Next(10, 40)), new Point(new Random().Next(100, 120), new Random().Next(10, 30)));
graphics.DrawLine(new Pen(brushText, new Random().Next(1, 3)), new Point(new Random().Next(20, 50), new Random().Next(0, 10)), new Point(new Random().Next(100, 120), new Random().Next(30, 40)));
graphics.DrawString(text, font, brushText, 0, 10);

}
else//画备选答案
{
Point middle = new Point(25, 20);
graphics.TranslateTransform(middle.X, middle.Y);
//这里是360°随机旋转
graphics.RotateTransform(new Random().Next(0, 360));
var format = new StringFormat(StringFormatFlags.NoClip)
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
graphics.DrawString(text, font, brushText, 0, 0, format);

}
brushText.Dispose();
graphics.Dispose();
return ImageToBase64(image);
}

显示

直接调用GetCode方法就能返回验证码对象

下面是后台代码,应为正确答案是放在AnswerValue里的所以我先把取出来放Session里面,然后把值清空后再通过json返回给浏览器。

1
2
3
4
5
6
7
public string GetVerCode()
{
var code = new VerificationCode.Code().GetCode();
Session["VERCODE"] = code.AnswerValue;
code.AnswerValue = "";
return JsonConvert.SerializeObject(code);
}

现在来堆点html代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<div class="form-group">
<ul class="vercode">
<li><img src=''/></li>
<li><img src=''/></li>
<li><img src=''/></li>
<li><img src=''/></li>
<li class="delete" onclick="delete_input()"></li>
</ul>
<div>
<img id="code-image"/> <a href="javascript:void(0);" onclick="load_vercode()">看不清?</a>
</div>
<ul class="vercode-anwser">
<li><img /></li>
<li><img /></li>
<li><img /></li>
<li><img /></li>
<li><img /></li>
<li><img /></li>
<li><img /></li>
<li><img /></li>
<li><img /></li>
</ul>
</div>

再来点js代码,这里只实现的图片上的效果,还没对数据验证(这里说说验证思路:每个图片对应一个ID,取到选择图片的ID用逗号分隔,然后与Session里的值对比)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<script>
$(function () {
//加载验证码
load_vercode();
//绑定验证码点击事件
$(".vercode-anwser").find("img").on("click", null, function () {
$(".vercode").find("img[src='']:eq(0)").attr("src", $(this).attr("src"));
});
});

function load_vercode() {
$(".vercode").find("img").attr("src", "");
$.get("GetVerCode", function (data) {
var result = JSON.parse(data);
$("#code-image").attr("src", "data:image/png;base64," + result.CodeImg);
$(".vercode-anwser").find("img").each(function (index) {
$(this).attr("src", "data:image/png;base64," + result.Answer[index].Img);
});
});
}
//删除事件
function delete_input() {
$(".vercode").find("img[src!='']:last").attr("src", "");
}
</script>

到这里代码就差不多了,以上思路只是单纯的个人想法,有兴趣的朋友一起来讨论吧。

源代码在这里–>地址 http://pan.baidu.com/s/1eS5Mn30 密码:7iud

分享代码改变世界