Linux SSH免密码登录设置

假设要登录的机器为192.168.1.100,当前登录的机器为192.168.1.101。

首先在101的机器上生成密钥(如果已经生成可以跳过):

$ ssh-keygen -t rsa

一路回车即可。

然后在将生成的公钥复制到机器100上的~/.ssh/authorized_keys中,使用如下命令:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.100

root为需要登录到机器100上的身份,需要替换成需要的用户名。

最后,测试免密码登录:

$ ssh root@192.168.1.100

发表在 linux | 留下评论

CentOS统计文件以及文件夹个数

在对linux进行管理的时候有时候需要对指定目录下的一些东西做统计,在网上搜索发现一个很不错的集合帖,非常使用,在此做个记录,分享给大家

在此也非常感谢原作者。

原文链接: https://www.cnblogs.com/zeze/p/6839230.html

1、统计当前文件夹下文件的个数,包含子文件夹

ls -lR|grep "^-"|wc –l

2、统计当前文件夹下目录的个数,包含子文件夹

ls -lR|grep "^d"|wc –l

3、统计当前文件夹下文件的个数,不包含子文件夹

ls -l |grep "^-"|wc –l

4、统计当前文件夹下目录的个数,不包含子文件夹

ls -l |grep "^d"|wc –l

发表在 linux | 留下评论

linux 压缩与解压常用命令

压缩

tar –cvf jpg.tar *.jpg #将目录里所有jpg文件打包成tar.jpg
tar –czf jpg.tar.gz *.jpg   #将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
tar –cjf jpg.tar.bz2 *.jpg #将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
tar –cZf jpg.tar.Z *.jpg   #将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
rar a jpg.rar *.jpg #rar格式的压缩,需要先下载rar for Linux
zip jpg.zip *.jpg #zip格式的压缩,需要先下载zip for linux

解压

tar –xvf file.tar #解压 tar包
tar -xzvf file.tar.gz #解压tar.gz
tar -xjvf file.tar.bz2   #解压 tar.bz2
tar –xZvf file.tar.Z   #解压tar.Z
unrar e file.rar #解压rar
unzip file.zip #解压zip
发表在 linux | 留下评论

web备忘录——php数据库操作的一个例子

最近学习了php操作数据库的一些知识,这里做了一个小小的例子,权当练习。因为时间比较仓促,所以代码写的比较简单,希望大家多多批评指正。

主要代码如下

html:

<!DOCTYPE html>
<html>
<head>
<meta charset=”UTF-8″>
<title>Memoe Online</title>
<link rel=”stylesheet” href=”styles/group.css”>
<link rel=”stylesheet” href=”styles/index.css”>
<script src=”js/jquery-3.4.1.min.js” type=”text/javascript”></script>
<script src=”js/memo.js”></script>
<script src=”js/My97DatePicker/WdatePicker.js”></script>
</head>
<body>
<!–main box–>
<div class=”main-box”>
<!–left part–>
<div class=”main-box-left left”>
<img class=”u-login-icon” src=”images/timg.jpg” alt=”smile”>
</div>
<!–right part–>
<div class=”main-box-right right”>
<!–right 0 memo列表展示区域–>
<div class=”memo-list left”>
<div class=”memo-list-head”>
Memo
</div>
<div class=”memo-list-content” id=”memo-list-box”>
<div class=”memo-list-content-item” data-id=””>
<p class=”u-list-title”>随手笔记</p>
<p class=”u-list-time”>16/10/22</p>
<p class=”u-list-desc”>普兰明 麻黄素假死糖可以查毒 </p>
</div>
</div>
</div>
<!–right 1 memo 编辑和显示区域–>
<div class=”memo-edit right”>
<!–头部功能操作区域–>
<div class=”g-blk10″></div>
<div class=”m-operation”>
<div class=”i-delete” onclick=”deleteData()”></div>
<div class=”i-save” onclick=”updateData()”></div>
<div class=”i-new” onclick=”newMemo()”></div>
</div>
<div class=”g-blk10″></div>
<div class=”g-blk30″></div>
<div class=”memo-edit-box”>
<form action=”#”>
<input type=”text” class=”u-edit-title” maxlength=”240″ id=”m_title”>
<div class=”g-blk10″></div>
<input type=”text” class=”u-edit-time Wdate input” id=”m_time” style=”width: 160px;border: 1px solid #A5ACB2;” onfocus=”WdatePicker({isShowClear:true,readOnly:true,dateFmt:’yyyy-MM-dd HH:mm:ss’})” readonly=”” placeholder=”年/月/日”>
<div class=”g-blk10″></div>
<input type=”text” class=”u-edit-desc” maxlength=”240″ id=”m_desc”>
<div class=”g-blk10″></div>
<textarea name=”content” id=”m_content” cols=”30″ rows=”10″ class=”u-edit-content”></textarea>
</form>
</div>

</div>
</div>

</div>
</body>
</html>

css

@charset “utf-8”;
html, body{height: 100%;}
.main-box{height: 100%; min-height: 500px; margin: 20px auto; min-width: 1200px; width: 96%;}
/*left part*/
.main-box-left{width: 5%; background: #f8f8f8; outline: 1px solid #ececec; height: 100%; min-height: 500px;}
.u-login-icon{display: block; margin: 20px auto; width: 50px; height: 50px; -moz-border-radius: 50%; border-radius: 50%;}
/*right part*/
.main-box-right{background: #FFFFFF; width: 95%; height: 100%; min-height: 500px; outline: 1px solid #ececec;}
.memo-list{outline: 1px solid #ececec; width: 18%; background: #fff; height: 100%; overflow: hidden;}
.memo-list-head{font-size: 20px; text-align: center; line-height: 30px; color: #878787;}
.memo-list-content{max-height: 97%;overflow-x: hidden;}
.memo-list-content-item{box-sizing: border-box; padding: 10px 20px;}
.memo-list-content-item:hover{background: #3fbc6c; transition: background-color 0.1s ease-in-out, width 0s ease-in-out 0.1s;}
.memo-list-content-item:hover *{color: #FFFFFF; transition: color 0.1s ease-in-out, width 0s ease-in-out 0.1s;}
.u-list-title{transition: color 0.1s ease-in-out, width 0s ease-in-out 0.1s; font-size: 16px; font-weight: 400; color: #4a4a4a; margin-bottom: 4px; max-height: 40px; overflow: hidden; overflow-wrap: break-word; text-overflow: ellipsis; white-space: nowrap; word-wrap: break-word; line-height: 20px; width: 302px;}
.u-list-time{transition: color 0.1s ease-in-out, width 0s ease-in-out 0.1s; font-size: 11px; font-weight: 400; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px;}
.u-list-desc{transition: color 0.1s ease-in-out, width 0s ease-in-out 0.1s; font-size: 12px; font-weight: 400; line-height: 17px;}
/*编辑区域*/
.memo-edit{width: 80%;}
.m-operation{width: 100%; text-indent: 10px; height: 30px; background: #fff; box-sizing: border-box; padding-left: 152px;}
.m-operation .i-delete{float: left; width: 24px; height: 24px; background: url(“../images/delete.png”);}
.m-operation .i-save{float: left; width: 24px; height: 24px; background: url(“../images/save.png”);margin-left:20px;}
.m-operation .i-new{float: left; width: 24px; height: 24px; background: url(“../images/new.png”);background-size:24px 24px;margin-left:20px;}
.memo-edit-box{width: 1100px; margin: 0 auto;}
.memo-edit-box .u-edit-title{color: #2dbe60; width: 80%; height: 35px; line-height: 35px; outline: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 300; margin-top: -1px; margin-left: 10px;}
.memo-edit-box .u-edit-time{margin-left: 10px; color: #2dbe60; line-height: 35px; outline: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 300; height: 35px; margin-top: -1px;}
.memo-edit-box .u-edit-desc{margin-left: 10px; color: #2dbe60; line-height: 35px; outline: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 300; height: 35px; margin-top: -1px;}
.memo-edit-box .u-edit-content{color: #2dbe60; width: 80%; min-height: 500px; line-height: 35px; margin-left: 10px; outline: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 300; margin-top: -1px;}

js

var currentId;
$(function () {
getData();

});


function getData() {
$.ajax({
url: ‘https://bcc.hotfeel.me/memo.php’,
data: {
action_type: ‘select’,
},
dataType: “json”,
method: ‘get’,
success: function (data) {
console.log(“查询返回的数据是”, data);
if (data.list) {
$(“#memo-list-box”).empty();
for (var i = 0; i < data.list.length; i++) {
var _html = “<div class=\”memo-list-content-item\” data-id=\”” + data.list[i].id + “\”>” +
“<p class=\”u-list-title\”>” + data.list[i].title + “</p>” +
“<p class=\”u-list-time\”>” + data.list[i].time + “</p>” +
“<p class=\”u-list-desc\”>” + data.list[i].description + “</p>” +
“</div>”;
$(“#memo-list-box”).append(_html);
}
$(“div.memo-list-content-item”).on(‘click’, function () {
currentId = $(this).data(‘id’);
$.ajax({
url: ‘https://bcc.hotfeel.me/memo.php’,
data: {
action_type: ‘select’,
id: currentId
},
dataType: “json”,
method: ‘get’,
success: function (data) {
console.log(“查询单个的数据是”, data);
if (data.list) {
$(“#m_title”).val(data.list[0].title);
$(“#m_time”).val(data.list[0].time);
$(“#m_desc”).val(data.list[0].description);
$(“#m_content”).val(data.list[0].content);
}
else {
getData();
alert(“该条数据已经被删除了!”);
}
},
error: function () {
console.log(“获取失败!”);
}
})
})
}
else {
$(“#memo-list-box”).empty();
console.log(“未获取到事项”);
}
},
error: function () {
console.log(“获取失败!”);
}
})
}


function newMemo() {
$(“#m_title”).val(“”);
$(“#m_time”).val(“”);
$(“#m_desc”).val(“”);
$(“#m_content”).val(“”);
currentId = null;
}

function updateData() {
let update_type = ”;
if (currentId) {
update_type = “update”;
}
else {
update_type = “insert”;
}
if ($(“#m_title”).val() != “”) {
$.ajax({
url: ‘https://bcc.hotfeel.me/memo.php’,
data: {
action_type: update_type,
id: currentId,
title: $(“#m_title”).val(),
time: $(“#m_time”).val(),
keywords: “”,
description: $(“#m_desc”).val(),
content: $(“#m_content”).val()
},
dataType: “json”,
method: ‘get’,
success: function (data) {
console.log(“返回的数据是”, data);
if (data[“affected rows”] > 0) {
getData();
update_type == “insert” ? alert(“新增成功!”) : alert(“修改成功!”);
} else {
update_type == “insert” ? alert(“新增失败!”) : alert(“修改失败!”);
}
},
error: function () {
console.log(“获取失败!”);
}
})
}
else {
alert(“请至少写个标题吧!”);
}
}

function deleteData() {
if (currentId) {
$.ajax({
url: ‘https://bcc.hotfeel.me/memo.php’,
data: {
action_type: ‘delete’,
id: currentId,
title: $(“#m_title”).val(),
time: $(“#m_time”).val(),
keywords: “”,
description: $(“#m_desc”).val(),
content: $(“#m_content”).val()
},
dataType: “json”,
method: ‘get’,
success: function (data) {
console.log(“返回的数据是”, data);
$(“#m_title”).val(“”);
$(“#m_time”).val(“”);
$(“#m_desc”).val(“”);
$(“#m_content”).val(“”);
getData();
alert(“删除成功!”);
currentId = null;
},
error: function () {
console.log(“获取失败!”);
}
})
} else {

alert(“未选择需要删除的事项!”)

}
}


function clearInput() {
$(“#m_title”).val(“”);
$(“#m_time”).val(“”);
$(“#m_desc”).val(“”);
$(“#m_content”).val(“”);
}

php接口

<?php
header(“Content-type:application/json;charset=utf-8”);
header(“Access-Control-Allow-Origin:*”);
header(‘Access-Control-Allow-Methods:POST.GET’);
header(‘Access-Control-Allow-Headers:x-requested-with, content-type’);
$username = ‘mem’;
$userpass = ‘pass’;
$dbhost = ‘****’;
$dbdatabase = ‘memo’;
$action_type = $_GET[“action_type”]; // 获取操作类型
$id = $_GET[“id”];
$title = $_GET[“title”];
$time = $_GET[“time”];
date_default_timezone_set(‘PRC’);//设置默认的时区
$keywords = $_GET[“keywords”];
$desc = $_GET[“desc”];//cut content
$content = $_GET[“content”];

if (!$desc) {
$desc = substr($content, 0, 10);//描述截取10个内容
}

if(!$time){
$time= date(‘Y-m-d h:i:s’, time());//时间为空时,时间设置为当前的时间
}

$db = new mysqli($dbhost, $username, $userpass, $dbdatabase);
if (mysqli_connect_error()) {//返回一个描述错误的字符串。如果没有错误发生则返回 NULL
echo ‘Could not connect to database.’;
exit;
} else {

if ($action_type == ‘insert’) {
$insert_arr = array();
$insert_sql = “INSERT INTO m_main (title,time,keywords,description,content) VALUES(‘” . $title . “‘,'” . $time . “‘,'” . $keywords . “‘,'” . $desc . “‘,'” . $content . “‘);”;
$insert_result = $db->query($insert_sql);
if (mysqli_affected_rows($db)) {//检查是否成功
$insert_arr[“insert_succeed”] = “1”;
$insert_arr[“affected rows”] = mysqli_affected_rows($db);
} else {
$insert_arr[“insert succeed”] = “-1”;
$insert_arr[“affected rows”] = mysqli_affected_rows($db);
}

echo(json_encode($insert_arr, JSON_UNESCAPED_UNICODE));
} else if ($action_type == ‘update’) {
$update_arr = array();
if ($id) { //判断id是否存在
$update_sql = “UPDATE m_main SET title='” . $title . “‘, time='” . $time . “‘,keywords='” . $keywords . “‘,description='” . $desc . “‘,content='” . $content . “‘ WHERE id=” . $id . “;”;
$update_result = $db->query($update_sql);
if (mysqli_affected_rows($db)) { //检查是否成功
$update_arr[“update succeed”] = “1”;
$update_arr[“affected rows”] = mysqli_affected_rows($db);
} else {//更新失败
$update_arr[“update succeed”] = “-1”;
$update_arr[“affected rows”] = mysqli_affected_rows($db);
}
} else {
$update_arr[“update error”] = “id不存在”;
}
echo json_encode($update_arr, JSON_UNESCAPED_UNICODE);
} else if ($action_type == ‘delete’) {
$delete_arr = array();
if ($id) { //判断id是否存在
$delete_sql = “DELETE FROM m_main WHERE id='” . $id . “‘;”;
$delete_result = $db->query($delete_sql);
if (mysqli_affected_rows($db)) { //检查是否成功
$delete_arr[“delete succeed”] = “1”;
$delete_arr[“delete rows”] = mysqli_affected_rows($db);
} else {//删除失败
$delete_arr[“delete succeed”] = “-1”;
$delete_arr[“affected rows”] = mysqli_affected_rows($db);
}
} else {
$delete_arr[“delete error”] = “需要删除的id不存在”;
}
echo json_encode($delete_arr, JSON_UNESCAPED_UNICODE);
} else if ($action_type == ‘select’) {
$select_arr = array();
$select_sql = “SELECT * from m_main ORDER BY id DESC;”;
if($id){
$select_sql = “SELECT * from m_main where id='”.$id.”‘;”;
}
$select_result = $db->query($select_sql);
if (mysqli_affected_rows($db)) { //检查是否成功
$select_arr[“select succeed”] = “1”;
while($row = mysqli_fetch_assoc($select_result)) {
$select_arr[“list”][]=$row;
}
$select_arr[“select rows”] = mysqli_affected_rows($db);
} else {//查询失败
$select_arr[“select succeed”] = “-1”;
$select_arr[“select rows”] = mysqli_affected_rows($db);
}
echo json_encode($select_arr, JSON_UNESCAPED_UNICODE);
} else {
$op_arr = array();
$op_arr[“error”] = “非法的操作”;
echo json_encode($op_arr, JSON_UNESCAPED_UNICODE);
}

mysqli_close($db);
}

比较关键的地方都有注释,很容易看懂。这样就完成了一个简单的网络备忘录。

发表在 php | 留下评论

Linux服务器用户登录邮件通知设置

前一段时间购买了国外的VPS,因为价格便宜,所以就一下购买了三年的,但是让人意外的是,通过查看系统日志来看,有许多非法的尝试登陆的行为,仔细检查服务器的安全设置,发现是ssh登陆的端口为22,是ssh登陆的默认端口,给许多扫描工具提供了便利,于是修改之。但是这些恶意的扫描行为给我敲响了警钟,国外的小众的VPS不可能像大厂防护那么好,就算防护的好,由于系统的漏洞被别人恶意登陆了服务器也不是一件让人愉快的事情,于是就想设置服务器,让每次登陆服务器都给指定邮箱发送一封有关登陆信息的邮件,百度了一下,发现此类的信息并不多,所幸在CSDN找到了一篇参考文章。通过参考这篇文章,成功的设置了服务器的登陆提醒。

首先,笔者的服务器系统是CentOS,此方法在CentOS或者红帽系列下是能成功的,其他的linux版本请自行尝试。

一、安装 mailx 12.4 

1.下载mailx 12.4命令

wget http://nchc.dl.sourceforge.net/project/heirloom/heirloom-mailx/12.4/mailx-12.4.tar.bz2  

      2.解压

tar jxvf mailx-12.4.tar.bz2 

      3.编译

cd mailx-12.4  
make 

     4.如果编译失败请下载补丁

wget http://www.linuxfromscratch.org/patches/blfs/7.6/mailx-12.4-openssl_1.0.0_build_fix-1.patch 
patch -Np1 -i mailx-12.4-openssl_1.0.0_build_fix-1.patch  

      打好补丁之后继续执行make编译,此时一般都能成功的,特别注意的是,下载补丁请下载到mailx-12.4文件夹里。

5.安装mailx-12.4

make install UCBINSTALL=/usr/bin/install 

    6.创建mailx到mail的软连接命令

ln -s /usr/local/bin/mailx /bin/mail  

    7.创建mailx配置文件软连接

ln -s /etc/nail.rc /etc/mail.rc 

     8.检查

whereis mailx #查看安装路径

mailx -V #查看版本信息

二、配置外部邮箱mailx

1.使用的mailx属于服务端外部邮箱,需要将系统自带的postfix停止,postfix操作命令 (需要root权限)

# /etc/init.d/postfix status #查看开启状态  
  
# /etc/init.d/postfix start  #开启  
  
# /etc/init.d/postfix stop   #关闭  
  
# chkconfig postfix off     #开机不自启

     2.编辑mailx配置信息


vim /etc/mail.rc  


     3.按住i添加配置信息

set from=     
set smtp=  
set smtp-auth-user=  
set smtp-auth-password=  
set smtp-auth=login  

set from=xxx\@xx.com     (这里写发件邮箱,可以用163或者qq邮箱,新申请的qq邮箱要14天后才能使用SMTP,@前面要加’\’)

set smtp=smtp.163.com:25  (这里是163服务器的地址和端口,不同的服务器的地址不同,普通邮箱和企业邮箱的smtp地址都不同)

set smtp-auth-user=   和 set from= 写一样的

set smtp-auth-password=      ( 如果是企业邮箱直接写邮箱密码,如果是个人邮箱,要写 授权码。)

set smtp-auth-login=login  (固定的)

配置好后按esc:wq保存退出

4.命令测试邮件能否发送

echo "$(whoami) login at: $(date) ip address: $(w|sed -n '3p'|awk '{print$3}')" | mail -s root xxxxxx@qq.com 

注意:1)-s 后面不可以带 ‘test’ 参数     xxxxx.@qq.com  写你的收件邮箱
          2)发送成功却没有收到邮件,有可能邮件标题和内容不谨慎,被当成垃圾邮件

四、配置root用户登录邮箱通知

1.修改.bashrc文件配置,设置被通知邮箱

vi ~/.bashrc  

    在文件下面接着添加 :

if [ -f /etc/bashrc ]; then  
. /etc/bashrc  
fi  
echo "$(whoami) login at: $(date) ip address: $(w|sed -n '3p'|awk '{print$3}')" | mail -s root xxxxx@qq.com  

想通知几个人就在后面加几句

echo "$(whoami) login at: $(date) ip address: $(w|sed -n '3p'|awk '{print$3}')" | mail -s root xxxxx@qq.com

注意:在root用户编辑.bashrc文件就只对root用户登录起作用。上面通知邮箱,有ip和登录时间和登录用户的信息,也可以改成自己想要的模板。

   保存好配置文件退出后,断开ssh链接,然后重新用root用户(或者你设置邮箱通知的用户)ssh登录服务器。一般情况下很快就会收到服务器发的通知邮件。

   现在的各大邮箱每天都有发件上限哦,到了上限就不会发送。

发表在 linux | 留下评论

centos7软链接

软链接: 也称为符号链接

1.类似windows快捷方式

2.可以跨文件系统创建

3.占用新的inode号

4.占用少量的磁盘空间

5.删除源文件后,软链接文件无效

优点:软链接(即快捷方式)可以方便快捷的访问路径很深的文件或文件夹。

创建软链接命令:

ln -s  源文件  目标文件
ln -s /etc/hosts /root/hosts.link

查看是否创建成功

如上图所示,即为成功

发表在 linux | 留下评论