站内公告:

我们的虚拟社区正式开通了

Main Menu

最新帖子

#61
Ubuntu / Ubuntu操作-04 SUDO设置
上次发布者 jvip_chen - 2022-5月-09 03:02 下午
在sudo于1980年前后被写出之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码,而sudo使一般用户不需要知道超级用户的密码即可获得权限。

1 授权普通用户执行root指令
授权普通用户执行root指令,就需要在/etc/sudoers文件中进行配置(或者直接使用visudo命令,不过只能在root用户下执行):

[root@test-huanqiu ~]# visudo
.....
# User privilege specification
pang ALL=(ALL) ALL

1.1 参数解释
第一个字段zhangj指定的是用户:可以是用户名,也可以是别名。每个用户设置一行,多个用户设置多行,也可以将多个用户设置成一个别名后再进行设置。
第二个字段ALL指定的是用户所在的主机:可以是ip,也可以是主机名,表示这个sudo设置后的文件即/etc/sudoers只在这个主机上生效,ALL表示在所有主机上都生效!限制的一般都是本机,也就是限制使用这个文件的主机;如果指定为"192.168.1.88"表示这个文件只有在这台主机上生效,如果拷贝到别的机子上是不起作用的!一般都指定为"ALL"表示所有的主机,不管文件拷到那里都可以用。
第三个字段(ALL)括号里指定的也是用户:指定以什么用户身份执行sudo,即使用sudo后可以享有所有账号下的权限。如果要排除个别用户,可以在括号内设置,比如ALL=(ALL,!root,!ops)。也可以设置别名
第四个字段ALL指定的是执行的命令:即使用sudo后可以执行所有的命令。也可以设置别名。NOPASSWD: ALL表示使用sudo的不需要输入密码。这里指令要用绝对路径
1.2 示例
如果我们想让用户pang只能在本主机(主机名为localhost)以root账户执行/bin/chown、/bin/chmod 两条命令,那么就应该这样配置:

[root@test-huanqiu ~]# visudo
.......
# User privilege specification
pang localhost=(root) /bin/chown,/bin/chmod

如果用户pang登录之后运行sudo命令,不满足上面三个条件之一的操作都将失败。

2 免密操作
安全是安全了,但很麻烦,每次执行指令都要输入密码,若要消除密码输入操作,修改配置文件:

2.1 使用root用户 visudo
#这里的NOPASSWD就是配置支持免密执行的字段
pang       ALL=(root)      NOPASSWD:/usr/bin/vim     
       

这里设置的是vim指令能够无密码执行!

2.2 手工修改/etc/sudoers文件
# 切换至root用户
sudo su - root
# 修改/etc/sudoers文件权限
chmod 744 /etc/sudoers
# 修改/etc/sudoers文件,添加如下内容,ubuntu为当前用户
ubuntu    ALL=(ALL:ALL) NOPASSWD:ALL
# 保存,并恢复权限
chmod 440 /etc/sudoers
# 重启系统
reboot
新启动一个terminal, 测试没有生效。
原因: 设了nopasswd,但是不起作用,原因是被后面的group的设置覆盖了。改为添加在文件最后一行即可。
# User privilege specification
root ALL=(ALL:ALL) ALL
pang ALL=(ALL:ALL) NOPASSWD:ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
pang    ALL=(ALL:ALL) NOPASSWD:ALL

3 授权给用户组
[root@test-huanqiu ~]# visudo
.....
# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move it further down)
%sudo ALL=(ALL) ALL
和授权给单个用户类似,只不过将用户名在这里换成%组名,所有在该组中的用户都按照此规则进行授权。

对于该例,所有在sudo组内的用户都有在任何终端(第一个ALL)、以任何用户(第二个ALL)、执行任何命令(第三个ALL)的权限,查看/etc/group文件可以知道哪些用户属于 sudo组。

4 操作技巧
4.1 执行root命令忘记加sudo:
输入一个长长的命令,按Enter之后出现无权限操作,因为在命令前面忘记加sudo了。
大多人的做法是按 ↑ 回到上一条命令,在该命令之前加上sudo,再执行该命令。
其实,也大可不必这样,巧妙的做法是:
只要输入 sudo !! 即可,这里的 !! 代表上一条命令。如:

[pang@localhost ~]$ cat test
cat: test: Permission denied
[pang@localhost ~]$ sudo !!
sudo cat test
lala
xiixixi'
nihao

即拿到了test文件的内容!

4.2 shell内置命令无法使用sudo
shell是一个交互式的应用程序,在执行外部命令时通过fork来创建一个子进程,再通过exec来加载外部命令的程序来执行。
但是如果一个命令是shell内置命令,那么只能直接由shell 来运行。
sudo 的意思是,以别的用户(如root)的权限来fork一个进程,加载程序并运行,因此sudo后面不能跟shell 的内置命令。\

[pang@localhost ~]$ sudo cd /sys/kernel/debug/
sudo: cd: command not found

此时应使用:

[pang@localhost ~]$ sudo bash   //或者sudo su - 或者 sudo -s,其实就使用sudo命令从当前用户切换到root用户
[root@localhost debug]# cd /sys/kernel/debug/
[root@localhost debug]#
4.3 sudo操作记入日志
作为一个Linux系统的管理员,不仅可以让指定的用户或用户组作为root用户或其它用户来运行某些命令,还能将指定的用户所输入的命令和参数作详细的记录。
而sudo的日志功能就可以用户跟踪用户输入的命令,这不仅能增进系统的安全性,还能用来进行故障检修。

创建sudo日志文件
[pang@localhost ~]$ sudo touch /var/log/sudo.log
修改/etc/rsyslog.conf配置文件(有些版本系统的这个文件名为/etc/syslog.conf),在该文件加入下面一行
[pang@localhost ~]$ sudo vim /etc/rsyslog.conf
.........
local2.debug /var/log/sudo.log //空白不能用空格,必须用tab

修改/etc/sudoers 配置文件
[pang@localhost ~]$ sudo vim /etc/sudoers
........
Defaults logfile=/var/log/sudo.log
重启 syslog 服务
[pang@localhost ~]$ sudo service rsyslog restart
验证
经过上面的配置,sudo的所有成功和不成功的sudo命令都记录到文件/var/log/sudo.log 中。
4.4 为多个用户分配不同的组:
在root用户的情况下,编辑/etc/group文件,这个文件就是控制系统的组和用户所属组情况的。

groupadd sudo                 #因为没有指定gid,所以就按着文件中的gid往后推的
sudo:x:504:                    #添加完之后在该文件中就出现了这条字段。

修改为:

sudo:x:504:batman,test            #此时,用户batman和test的附属组就是sudo了
此时再visudo

%sudo   ALL=(root)      NOPASSWD:/usr/bin/vim
%sudo   ALL=(root)      NOPASSWD:/bin/cat

保存退出,可以用:visudo -c来检查语法,返回OK,没问题。
检测:

-rw-------. 1 root root 1595 Jul 24 05:00 rsyncd.conf
-rw-------. 1 root root    8 Jul 24 05:00 rsyncd.pass
-rw-------. 1 root root   14 Jul 24 05:00 rsyncd.pwd

这三个文件,只有root有操作权限,现在

[pang@localhost]$ sudo vim rsyncd.conf
发现也是ok的。

5 sudo问题记录
手工修改/etc/sudoers时,如果不注意操作会导致一些问题产生,特此记录。

5.1 错误修改/etc/sudoers所属用户后恢复
在修改设置sudo免密码时,无意将chmod 440 /etc/sudoers改为了chown 440 /etc/sudoers后,导致系统重启后无法使用sudo命令。

解决方法:

(1) 重启电脑,进入ubuntu 恢复模式Grub(一直按esc或shift)
(2) 在Grub的菜单中选择root
(3) 重新输入命令 chown root /etc/sudoers
(4) reboot
#62
Ubuntu / 通过PHP执行系统命令
上次发布者 jvip_chen - 2022-5月-09 02:56 下午
PS.这几天用PHP写了一个小工具,因为要部署在Linux,又要暂时使用sudo执行一些Shell命令,网上也有很多资料,但是有的要么就直接把Web服务器用户直接提升权限,要么就使用密码存文件方式,安全性都不是特别好,好在搜索到在Wordpress上一位外国友人的文章,很实用,安全性也不错,就把它翻译过来和大家分享一下,下面是正文部分。

  许多时候我们需要在Linux系统上执行系统命令--比如来删除一个目录或者重启服务。但是,因为Apache并不是以root权限运行的,这样使用PHP的exec()、system()或者passthru()函数来实现以上功能就变得不太可能。

  解决这个问题的方案是非常简单的,特别是在Ubuntu上。Apache的用户www-data需要获得权限来使用sudo执行一些应用。

  1、执行命令

command sudo visudo
  2、在文件末尾,增加如下内容

www-data ALL=NOPASSWD: /sbin/iptables, /usr/bin/du
  假设你希望使用超级用户(root)权限运行iptables和du命令。但是,如果你想使用超级用户权限运行每一个应用,添加以下命令来代替上面的命令。 

www-data ALL=NOPASSWD: ALL
  3、就是这样,现在像下面这种方式在你的php脚本中使用exec()函数

exec("sudo iptables -P FORWARD ACCEPT");
  这使我能够在服务器上执行脚本,这个脚本我早先不得不使用setuid和联合是否为cron的方式。但是现在,PHP使这变得方便。
PS.

1、修改sudoers还有另外一种方式,使用 vi /etc/sudoers,在此之前要 sudo chmod u+w /etc/sudoers,获取权限。

2、如果要让PHP运行我们自己写的脚本,我在Google上看到用这个方法也是可以的。例如:www-data ALL=NOPASSWD: /tmp/script.sh

     要写明sh文件的具体位置
#63
Redis数据库 / 查看redis cluster集群信息
上次发布者 jvip_chen - 2022-5月-09 01:49 下午
注:ip为安装redis的那台服务器(集群中的其中一台)的ip,password为redis的密码

1. 集群相关信息查看
1.集群状态
redis-cli -h ip -p 6401 -a password cluster info<br>
2.集群节点信息
redis-cli -h ip -p 6401 -a password cluster nodes<br>
3.节点内存、cpu、key数量等信息(每个节点都需查看)
redis-cli -h ip -p 6401 -a password info<br>
4.从redis集群中查看key(只需要连接master节点查看)
a.查看该节点的所有key
redis-cli -h ip -p 6401 -a password keys *<br>
b.查看key的value值
redis-cli -h ip -p 6401 -a password -c get key<br>
c.查看key值得有效期
redis-cli -h ip -p 6401 -a password -c ttl key
  

2.查看 redis 中存的数据
ssh root@ip
Password: password
keys *
查看存储的数据剩余过期时间
ttl key<br>
查看key的类型(string,set,list,hash)
type key<br>
查看key的值(string类型)
get key<br>
查看key的值(set类型)
scard key //获取 set 集合中元素的数量
smembers key //查看 set 中的内容<br>
查看key的值(hash类型)
hlen key //获取 key 键的字段数量
hgetall key //返回 key 键的所有字段及其值
hkeys key //获取 key 键中所有字段的名字
hvals key //获取 key 键中所有字段的值
#64
Shell脚本 / Linux nohup 命令
上次发布者 jvip_chen - 2022-5月-09 01:46 下午
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

使用权限
所有使用者

语法格式
nohup Command [ Arg ... ] [ & ]
参数说明:
Command:要执行的命令。

Arg:一些参数,可以指定输出文件。

&:让命令在后台执行,终端退出后命令仍旧执行。

实例
以下命令在后台执行 root 目录下的 runoob.sh 脚本:

nohup /root/runoob.sh &
在终端如果看到以下输出说明运行成功:

appending output to nohup.out
这时我们打开 root 目录 可以看到生成了 nohup.out 文件。

如果要停止运行,你需要使用以下命令查找到 nohup 运行脚本到 PID,然后使用 kill 命令来删除:

ps -aux | grep "runoob.sh"
参数说明:

a : 显示所有程序
u : 以用户为主的格式来显示
x : 显示所有程序,不区分终端机
另外也可以使用 ps -def | grep "runoob.sh" 命令来查找。

找到 PID 后,就可以使用 kill PID 来删除。

kill -9  进程号PID
以下命令在后台执行 root 目录下的 runoob.sh 脚本,并重定向输入到 runoob.log 文件:

nohup /root/runoob.sh > runoob.log 2>&1 &
2>&1 解释:

将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 runoob.log 文件中。

0 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出)
#65
服务器运维 / supervisor使用
上次发布者 jvip_chen - 2022-5月-06 02:43 下午
安装
# 安装 epel 源,如果此前安装过,此步骤跳过
yum install -y epel-release
yum install -y supervisor
systemctl enable supervisord # 开机自启动
systemctl start supervisord # 启动supervisord服务
# systemctl status supervisord # 查看supervisord服务状态
supervisord
运行supervisor时会启动一个进程supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启

systemctl restart supervisord
supervisorctl (命令管理工具)
可以用来执行start、stop、restart等命令,来对这些子进程进行管理

# 启动 hyperf 应用
supervisorctl start hyperf
# 重启 hyperf 应用
supervisorctl restart hyperf
# 停止 hyperf 应用
supervisorctl stop hyperf
# 查看所有被管理项目运行状态
supervisorctl status
# 重新加载配置文件
supervisorctl update
# 重新启动所有程序
supervisorctl reload
网页管理
supervisor提供了基于web的控制,管理员可以通过在页面上点点按钮即可完成对进程的启动、重启以及查看状态等操作,甚是方便

vim /etc/supervisor.conf

[inet_http_server]
port=127.0.0.1:9001
;username=test
;password=123456
systemctl start supervisord
# sudo /usr/bin/supervisord -n -c /etc/supervisord.conf
打开浏览器,输入地址127.0.0.1:9001
#66
服务器运维 / supervisorctl常用指令
上次发布者 jvip_chen - 2022-5月-06 02:41 下午
查看帮助
help
help <action>

关闭supervisord
shutdown
重载配置文件并重启supervisord和program
reload
读取当前运行配置和program配置文件的差异
reread
重载配置文件并重启受影响的program
update
重启program(不会重载配置文件)
restart <name>
restart <name> <name>
restart all

清空program日志
clear <name>
clear <name> <name>
clear all

前台显示program(Ctrl+C退出)
fg <name>
显示supervisord或program ID
pid
pid <name>
pid all

启动program
start <name>
start <name> <name>
start all
停止program
stop <name>
stop <name> <name>
stop all

查看program状态
status <name>
status <name> <name>
status

输出program最新日志(默认stdout,Ctrl+C退出)
tail [-f] <name> [stdout|stderr] (default stdout)
输出supervisord最新日志(Ctrl+C退出)
maintail [-f]
#67
PHP 开发 / 报错file_get_contents(): SSL ope...
上次发布者 jvip_chen - 2022-5月-03 07:39 下午
报错内容
file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

这和本地环境有关,是否开启了ssl验证。
解决方式:修改配置,或者修改代码

$stream_opts = [
    "ssl" => [
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ]
]; 
 
$response = file_get_contents($url, false, stream_context_create($stream_opts));
#68
Linux 系统 / linux增加swap分区和删除swapfile文件的方法
上次发布者 jvip_chen - 2022-4月-29 09:42 上午
创建swapfile文件
执行命令:dd if=/dev/zero of=swapfile bs=1024 count=5000000
注:可根据实际需要更改count值的大小,这里设置5000000,大概就是4G多

dd if=/dev/zero of=swapfile bs=1024 count=500000
500000+0 records in
500000+0 records out
512000000 bytes (512 MB) copied, 0.847481 s, 604 MB/s
 ll
total 500000
-rw-r--r-- 1 root root 512000000 Sep 11 16:24 swapfile

将swapfile设置为swap空间

执行命令:mkswap swapfile

[root@dics-no iflytek]# mkswap swapfile
Setting up swapspace version 1, size = 499996 KiB
no label, UUID=bf7c48ab-d829-4291-a477-f75cdd33f72a
[root@dics-no iflytek]#

启用交换空间

执行命令:swapon swapfile

[root@dics-no iflytek]# swapon swapfile
swapon: swapfile: insecure permissions 0644, 0600 suggested.
[root@dics-no iflytek]#

查看是否增加swap分区

执行命令:free -h

[root@dics-no iflytek]# free -h
total used free shared buffers cached
Mem: 31G 918M 30G 8.3M 704K 589M
-/+ buffers/cache: 328M 30G
Swap: 488M 0B 488M
[root@dics-no iflytek]#
删除swapfile

如果创建了swapfile之后,想要删除,必须先执行以下命令
swapoff swapfile
[root@i-5608690E /]# swapoff swapfile
然后再执行删除文件操作
rm swapfile
[root@i-5608690E /]# rm swapfile
注:如果没有执行swapoff操作,就执行执行删除文件的操作,系统会报错,不给删除。swapoff相当于是卸载swap分区。
#69
Linux 系统 / Linux统计文件个数
上次发布者 jvip_chen - 2022-4月-27 05:58 下午
1.显示目录中的文件:
ls -l | grep "^-"
我们可以用wc命令进行统计:

wc [-lwm]

参数:

-l 仅列出行数;

-w 仅列出多少字(英文单字);

-R 递归列出子目录

-m 多少字符;

那么,
2.统计文件夹中文件个数
ls -l ./|grep "^-"|wc -l
3.统计文件夹中目录个数
ls -l ./|grep "^d"|wc -l
4.统计文件夹下文件个数,包括子文件
ls -lR | grep "^-"| wc -l
5.统计文件夹下目录个数,包括子目录
ls -lR | grep "^d"| wc -l
#70
PHP框架-Yii / yii2 mysql 版本_yii2 数据库版本控制 mig...
上次发布者 jvip_chen - 2022-4月-27 02:56 下午
对于在日常的开发,我们用mysql,当线下分几个小组对一个网站进行开发的时候,在线下建立表,如何同步到线上就成了一个问题。

svn git等版本控制系统,可以控制文件的版本,yii2通过migrate,来进行sql文件的上传,以及执行。

migrate的使用:

1.首先创建migrate文件,语法很简单:

./yii migrate/create test_user
执行后,就会在/console/migrations/下面生成m160511_080937_test_user.php。

下面是执行log

[root@services datacenter_1000]# ./yii migrate/create test_user

Yii Migration Tool (based on Yii v2.0.7)

Create new migration '/www/web/datacenter/datacenter_1000/console/migrations/m160511_080937_test_user.php'? (yes|no) [no]:yes

New migration created successfully.

默认的路径是在console/migrations下面。

如果执行 ./yii migrate   就会执行console/migrations 下面的sql,当然,在执行前,需要到表migration 中查看信息,然后在决定执行那些sql,执行的是文件中的up()方法里面的sql,如果是事务操作,则不适用up(),而使用safeUp()方法。

有时候我们有自己的扩展,然后把migration放到自己的扩展里面,可以通过加入参数–migrationPath=@yii/log/migrations

来创建,执行相应的数据库脚本、

./yii migrate --migrationPath=@yii/log/migrations/
同样 down() , 采用 safeDown()方法。

如下是所有这些数据库访问方法的列表:

yii\db\Migration::execute(): 执行一条 SQL 语句
yii\db\Migration::insert(): 插入单行数据
yii\db\Migration::batchInsert(): 插入多行数据
yii\db\Migration::update(): 更新数据
yii\db\Migration::delete(): 删除数据
yii\db\Migration::createTable(): 创建表
yii\db\Migration::renameTable(): 重命名表名
yii\db\Migration::dropTable(): 删除一张表
yii\db\Migration::truncateTable(): 清空表中的所有数据
yii\db\Migration::addColumn(): 加一个字段
yii\db\Migration::renameColumn(): 重命名字段名称
yii\db\Migration::dropColumn(): 删除一个字段
yii\db\Migration::alterColumn(): 修改字段
yii\db\Migration::addPrimaryKey(): 添加一个主键
yii\db\Migration::dropPrimaryKey(): 删除一个主键
yii\db\Migration::addForeignKey(): 添加一个外键
yii\db\Migration::dropForeignKey(): 删除一个外键
yii\db\Migration::createIndex(): 创建一个索引
yii\db\Migration::dropIndex(): 删除一个索引

有时,你可能只需要提交一个或者少数的几个迁移,你可以使用该命令指定需要执行的条数,而不是执行所有的可用迁移。例如,如下命令将会尝试提交前三个可用的迁移:

yii migrate 3
你也可以指定一个特定的迁移,按照如下格式使用 migrate/to 命令来指定数据库应该提交哪一个迁移:

yii migrate/to 150101_185401 # using timestamp to specify the migration 使用时间戳来指定迁移
yii migrate/to "2015-01-01 18:54:01" # using a string that can be parsed by strtotime() 使用一个可以被 strtotime() 解析的字符串
yii migrate/to m150101_185401_create_news_table # using full name 使用全名
yii migrate/to 1392853618 # using UNIX timestamp 使用 UNIX 时间戳

其他:来自于官网资料。

还原迁移

你可以使用如下命令来还原其中一个或多个意见被提交过的迁移:

yii migrate/down # revert the most recently applied migration 还原最近一次提交的迁移
yii migrate/down 3 # revert the most 3 recently applied migrations 还原最近三次提交的迁移

重做迁移

重做迁移的意思是先还原指定的迁移,然后再次提交。如下所示:

yii migrate/redo # redo the last applied migration 重做最近一次提交的迁移
yii migrate/redo 3 # redo the last 3 applied migrations 重做最近三次提交的迁移

列出迁移

你可以使用如下命令列出那些提交了的或者是还未提交的迁移:

yii migrate/history # 显示最近10次提交的迁移
yii migrate/history 5 # 显示最近5次提交的迁移
yii migrate/history all # 显示所有已经提交过的迁移
yii migrate/new # 显示前10个还未提交的迁移
yii migrate/new 5 # 显示前5个还未提交的迁移
yii migrate/new all # 显示所有还未提交的迁移

修改迁移历史

有时候你也许需要简单的标记一下你的数据库已经升级到一个特定的迁移,而不是实际提交或者是还原迁移。这个经常会发生在你手动的改变数据库的一个特定状态,而又不想相应的迁移被重复提交。那么你可以使用如下命令来达到目的:

yii migrate/mark 150101_185401 # 使用时间戳来指定迁移
yii migrate/mark "2015-01-01 18:54:01" # 使用一个可以被 strtotime() 解析的字符串
yii migrate/mark m150101_185401_create_news_table # 使用全名
yii migrate/mark 1392853618 # 使用 UNIX 时间戳