linux基础学习-10.4-正则表达式练习题

一、基础正则

环境准备
[[email protected] oldboy]# cat /oldboy/re.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is
http://oldboy.blog.51cto.com

our size is
http://blog.oldboyedu.com

my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!

1、^ ^m 表示以....开头的行

[[email protected] oldboy]# grep ‘^m‘ re.txt

my blog is http://oldboy.blog.51cto.com

my qq is 49000448

my god ,i am not oldbey,but OLDBOY!

2、 $ m$ 表示以....结尾的行

[[email protected] oldboy]# cat -A re.txt

I am oldboy teacher!$

I teach linux.$

$

I like badminton ball ,billiard ball and chinese chess!$

my blog is http://oldboy.blog.51cto.com $ #注意此处结尾是空格不是m

$

our size is http://blog.oldboyedu.com $ #注意此处结尾是空格不是m

$

my qq is 49000448$

$

not 4900000448.$

my god ,i am not oldbey,but OLDBOY!$

#删除结尾的空格

[[email protected] oldboy]# vim re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

#检查是否修改成功

[[email protected] oldboy]# cat -A re.txt

I am oldboy teacher!$

I teach linux.$

$

I like badminton ball ,billiard ball and chinese chess!$

my blog is http://oldboy.blog.51cto.com$

$

our size is http://blog.oldboyedu.com$

$

my qq is 49000448$

$

not 4900000448.$

my god ,i am not oldbey,but OLDBOY!$

[[email protected] oldboy]#

[[email protected] oldboy]# grep ‘m$‘ re.txt

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

cat -A #显示出文件中所有的符号 $这一行的结尾

[[email protected] oldboy]# grep ‘ ‘ re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

3、 ^$ 空行 这一行里面什么都没有

[[email protected] oldboy]# grep -n ‘^$‘ re.txt

3:

6:

8:

10:

练习题:排查文件中的空行

[[email protected] oldboy]# grep -v ‘^$‘ re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

4、 . 任意一个字符 不会匹配空行

#grep -o ‘.‘ re.txt

#-o 显示grep的执行过程,grep每一次找出什么

grep -o ‘.‘ re.txt

#-o 显示grep的执行过程,grep每一次找出什么

#-o 的结果中 每一行表示 grep每次找出什么

[[email protected] oldboy]# grep ‘0‘ re.txt

my qq is 49000448

not 4900000448.

[[email protected] oldboy]# grep -o ‘0‘ re.txt

0

0

0

0

0

0

0

0

[[email protected] oldboy]# grep ‘00‘ re.txt

my qq is 49000448

not 4900000448.

[[email protected] oldboy]# grep -o ‘00‘ re.txt

00

00

00

说明:如果匹配的内容在一行中有多处,grep会从左到右匹配到最后一个,多多益善

提示:点(.)的特殊含义小结:

1、当前目录

2、使得文件生效相当于source

3、隐藏文件的开头

4、任意一个字符

5、 撬棍 转义字符 去掉符号特殊含义 脱掉马甲,打回原形

显示出文件中 以.结尾的行?

[[email protected] oldboy]# grep ‘.$‘ re.txt

I teach linux.

not 4900000448.

撬棍系列 转义字符系列

\n ====== 回车

6、 * 前一个字符连续出现0次或0次以上

[[email protected] oldboy]# grep ‘0*‘ re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

[[email protected] oldboy]#

[[email protected] oldboy]# grep ‘0*‘ re.txt -o

000

00000

#连续出现

#正则表示连续出现的时候,会尽可能的匹配(吃)更多的符号 贪婪性

[[email protected] oldboy]# #0* 表示0连续出现0次

[[email protected] oldboy]# #0* 表示0连续出现1次及1次以上

[[email protected] oldboy]# #0

[[email protected] oldboy]# #000

[[email protected] oldboy]# #0000000

[[email protected] oldboy]# #0* 表示0连续出现0次

[[email protected] oldboy]# #‘0*‘ 只出现0次的时候 ====== ‘‘

[[email protected] oldboy]# #会把整个文件的内容都显示出来

[[email protected] oldboy]# grep ‘‘ re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

小结正则之*:

1]] 贪婪性

2]] 连续出现

7、 .* 所有 任何符号

#在正则中表示连续出现 表示所有 贪婪性

找出文件中以字母m开头的行 并且 以m结尾的行

[[email protected] oldboy]# grep ‘^m‘ re.txt

my blog is http://oldboy.blog.51cto.com

my qq is 49000448

my god ,i am not oldbey,but OLDBOY!

[[email protected] oldboy]# grep ‘^m‘ re.txt |grep ‘m$‘

my blog is http://oldboy.blog.51cto.com

[[email protected] oldboy]# grep ‘^m.*m$‘ re.txt

my blog is http://oldboy.blog.51cto.com

[[email protected] oldboy]# grep ‘^.*m$‘ re.txt

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

[[email protected] oldboy]# grep ‘m$‘ re.txt

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

[[email protected] ~]# grep ‘.*m‘ re.txt

8、 [] [abc] 表示一个整体,a或b或c任意一个字符

[[email protected] oldboy]# grep ‘[abc]‘ re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my god ,i am not oldbey,but OLDBOY!

grep ‘[abc]‘ re.txt -o

===>从哪里来,到哪里去用的是-

[[email protected] oldboy]# grep ‘[a-z]‘ re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

[[email protected] oldboy]# grep ‘[A-Z]‘ re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my god ,i am not oldbey,but OLDBOY!

[[email protected] oldboy]# grep ‘[a-zA-Z]‘ re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

#找出文件中以m或n开头的行

[[email protected] oldboy]# #第1个里程碑-m或n

[[email protected] oldboy]# grep ‘[mn]‘ re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

[[email protected] oldboy]# #第2个里程碑-以m或n开头的行

[[email protected] oldboy]# grep ‘^[mn]‘ re.txt

my blog is http://oldboy.blog.51cto.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

grep ‘[a-z]‘ re.txt

grep ‘[A-Z]‘ re.txt

grep ‘[0-9]‘ re.txt

9、 [^] 排除 [^abc]

[[email protected] ~]# grep ‘[^abc]‘ /oldboy/re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

||||||||||||||||||000000000

二、扩展正则

1、 + 前一个字符连续出现1次或多次

[[email protected] oldboy]# egrep ‘0+‘ re.txt

my qq is 49000448

not 4900000448.

[[email protected] oldboy]# egrep ‘0‘ re.txt

my qq is 49000448

not 4900000448.

[[email protected] oldboy]# egrep ‘0+‘ re.txt -o

000

00000

#+可以把连续的字符变为一个整体

[[email protected] oldboy]# egrep ‘0‘ re.txt -o

0

0

0

0

0

0

0

0

[[email protected] oldboy]# #连续出现

取出文件中连续出现的小写字母

[[email protected] oldboy]# #取出文件中连续出现的小写字母

[[email protected] oldboy]# egrep ‘小写字母+‘ re.txt

[[email protected] oldboy]# egrep ‘[a-z]+‘ re.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

[[email protected] oldboy]# egrep ‘[a-z]+‘ re.txt -o

am

oldboy

teacher

teach

linux

like

badminton

ball

billiard

ball

and

chinese

chess

my

blog

is

http

oldboy

blog

cto

com

our

size

is

http

blog

oldboyedu

com

my

qq

is

not

my

god

i

am

not

oldbey

but

小结:

1.+连续出现 1次及多次

  1. 可以把连续的字符变为一个整体,一次取出来(-o)
  2. +一般与[]配合

#1.找出规律

#2.中英文符号

#3.区分大小写

[[email protected] oldboy]# egrep ‘^[0-9]+$‘ id.txt

440304199604012792

130528197108126121

342923198310042132

330900199806382320

654126197703092303

131127197105115662

[[email protected] oldboy]# egrep ‘^[0-9]+X$‘ id.txt

61242619860416291X

[[email protected] oldboy]# egrep ‘^[0-9]+[0-9X]$‘ id.txt

440304199604012792

130528197108126121

342923198310042132

61242619860416291X

330900199806382320

654126197703092303

131127197105115662

2、 | 或者

[[email protected] oldboy]# egrep ‘linux或oldboy‘ re.txt

[[email protected] oldboy]# egrep ‘linux|oldboy‘ re.txt

I am oldboy teacher!

I teach linux.

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

3、 () 变成一个整体 反向引用 后向引用

#先乘除后加减,有括号的先算括号里面的

[[email protected] oldboy]# egrep ‘oldbo|ey‘ re.txt

I am oldboy teacher!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my god ,i am not oldbey,but OLDBOY!

[[email protected] oldboy]# egrep ‘oldb(o|e)y‘ re.txt

I am oldboy teacher!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my god ,i am not oldbey,but OLDBOY!

#反向引用 后向引用 sed

##先通过()把你想要的内容保护起来,然后再使用

echo 123456|xxxxxxx

<123456>

[[email protected] oldboy]# echo 123456

123456

[[email protected] oldboy]# echo 123456|sed -r ‘s#(.*)#\1#g‘

123456

[[email protected] oldboy]# echo 123456|sed -r ‘s#(.*)#<\1>#g‘

<123456>

echo 123456

34

[[email protected] oldboy]# echo 123456

123456

[[email protected] oldboy]# echo 123456|sed -r ‘s#12(34)56#\1#g‘

34

[[email protected] oldboy]# echo 123456|sed -r ‘s#(1)2(34)5(6)#\2#g‘

34

[[email protected] oldboy]# echo 123456|sed -r ‘s#(.).(..)..#\2#g‘

34

小结:

1.()小括号 []中括号 {}大括号 花括号

2.后向引用(sed)

4、 {} 花括号

0{n,m} 前一个字符连续出现至少n次,最多m次 >=n && <=m

0{n} 前一个字符连续出现n次 ==n

0{n,} 前一个字符连续出现至少n次 >=n

0{,m} 前一个字符连续出现最多m次 <=m

[[email protected] oldboy]# egrep ‘0{1,4}‘ re.txt

my qq is 49000448

not 4900000448.

[[email protected] oldboy]# egrep ‘0{1,4}‘ re.txt -o

000

0000

0

[[email protected] oldboy]# egrep ‘0{2,4}‘ re.txt

my qq is 49000448

not 4900000448.

[[email protected] oldboy]# egrep ‘0{2,4}‘ re.txt -o

000

0000

#取出文件中连续出现8次到10次的数字

[[email protected] oldboy]# #取出文件中连续出现8次到10次的数字

[[email protected] oldboy]# egrep ‘[0-9]{8,10}‘ re.txt

my qq is 49000448

not 4900000448.

[[email protected] oldboy]# egrep ‘^[0-9]{17}[0-9X]$‘ id.txt

440304199604012792

130528197108126121

342923198310042132

61242619860416291X

330900199806382320

330900199806382320

654126197703092303

三、取出ip地址(ifconfig ip)

方法1-sed

[[email protected] oldboy]# ifconfig eth0|sed -n ‘2p‘

      inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0

[[email protected] oldboy]# ifconfig eth0|sed -n ‘2p‘|sed ‘s#^.*:##g‘

255.255.255.0

[[email protected] oldboy]# ifconfig eth0|sed -n ‘2p‘|sed ‘s#^.*addr:##g‘

10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0

[[email protected] oldboy]# ifconfig eth0|sed -n ‘2p‘|sed ‘s#^.*addr:##g‘|sed ‘s# Bc.*$##g‘

10.0.0.200

#方法2-sed-后向引用

[[email protected] oldboy]# ifconfig eth0|sed -n ‘2p‘

      inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0

[[email protected] oldboy]# ifconfig eth0|sed -n ‘2p‘|sed -r ‘s#^.*dr:(.*) Bc.*$#\1#g‘

10.0.0.200

#方法3-awk-指定多个分隔符

[[email protected] oldboy]# ifconfig eth0|awk ‘NR==2‘

      inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0

[[email protected] oldboy]# ifconfig eth0|awk ‘NR==2‘|awk -F "[ :]+" ‘{print $4}‘

10.0.0.200

[[email protected] oldboy]# ifconfig eth0|awk ‘NR==2‘|egrep ‘[ :]‘

      inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0

[[email protected] oldboy]# ifconfig eth0|awk ‘NR==2‘|egrep ‘[ :]+‘

      inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0

#方法4-awk-‘条件{命令}‘

[[email protected] ~]# ifconfig eth0|awk ‘NR==2‘

      inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0

[[email protected] ~]# ifconfig eth0|awk ‘NR==2‘|awk ‘{print $2}‘

addr:10.0.0.200

[[email protected] ~]# #awk ‘找谁{干啥}‘

[[email protected] ~]# #awk ‘条件{命令}‘

[[email protected] ~]# ifconfig eth0|awk ‘NR==2{print $2}‘

addr:10.0.0.200

[[email protected] ~]# #错误 ifconfig eth0|awk -F"[ :]+" ‘NR==2{print $2}‘

[[email protected] ~]# ifconfig eth0|awk -F "[ :]+" ‘NR==2{print $4}‘

10.0.0.200

#方法5-sed

sed -nr ‘2s#^.*dr:(.*) Bc.*$#\1#gp‘

sed -n ‘2s#inet#oldboy#gp‘

[[email protected] ~]# ifconfig eth0|sed -n ‘2s#inet#oldboy#gp‘

      oldboy addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0

老男孩IT教育出品-sed命令反向引用取出网卡ip地址详解

https://www.processon.com/view/link/59fa9baae4b0f84f8975eefe

#方法6

[[email protected] ~]# ip a s eth0 |awk ‘NR==3‘

inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0

[[email protected] ~]# ip a s eth0 |awk ‘NR==3‘|awk -F"[ /]+" ‘{print $3}‘

10.0.0.200

#方法7

[[email protected] ~]# ip a s eth0 |sed -n ‘3p‘

inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0

[[email protected] ~]# ip a s eth0 |sed -n ‘3p‘|sed -r ‘s#^.* (.*)/##g‘

24 brd 10.0.0.255 scope global eth0

[[email protected] ~]# ip a s eth0 |sed -n ‘3p‘|sed -r ‘s#^.* ([0-9.]+)/.*$#\1#g‘

10.0.0.200

四、取出文件权限

#方法1

[[email protected] ~]# stat /etc/hosts |awk -F "[(/]" ‘NR==4‘

Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

[[email protected] ~]# stat /etc/hosts |awk -F "[(/]" ‘NR==4{print $2}‘

0644

#方法2-sed

[[email protected] ~]# stat /etc/hosts |sed -n ‘4p‘

Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

[[email protected] ~]# stat /etc/hosts |sed -n ‘4p‘|sed -r ‘s#^.*\(0.*/##g‘

root\)

[[email protected] ~]# stat /etc/hosts |sed -n ‘4p‘|sed -r ‘s#^.*\(0(.*)/-##g‘

rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

[[email protected] ~]# stat /etc/hosts |sed -n ‘4p‘|sed -r ‘s#^.*\(0(.*)/-.*$##g‘

[[email protected] ~]# stat /etc/hosts |sed -n ‘4p‘|sed -r ‘s#^.*\(0(.*)/-.*$#\1#g‘

644

https://www.processon.com/view/link/59fbc9c0e4b0f84f89765231

#方法3

[[email protected] ~]# stat /etc/hosts |awk ‘NR==4‘|sed -r ‘s#^.*\(0|/.*$##g‘

644

#方法4-stat

[[email protected] ~]# stat -c%a /etc/hosts

644

[[email protected] ~]# #命令的结果中 有你想要的

练习题:

1、取ip地址

2、取文件权限

原文地址:https://www.cnblogs.com/Klanti/p/9143253.html

时间: 2024-08-04 02:39:45

linux基础学习-10.4-正则表达式练习题的相关文章

linux基础学习-10.3-正则表达式详解

一.正则表达式 RE regular expression 1.什么是正则 为何用它? 你可以通过什么方法选出这里面的身份证号码. 440304199604012792 130528197108126121 3605sss98304033896 342923198310042132 1404ddddddddd5694X 61242619860416291X 5002xxxxxx04279521 330900199806382320 654126197703092303 1311271971051

linux基础学习-10.2-通配符回顾

1. * 所有 任何东西 以.txt结尾 *.txt 以.log结尾 *.log 系统中以ls开头的文件. find / -type f -name "ls*" 找出系统中文件名包含oldboy的文件. find / -type f -name "*oldboy*" 2.{} 生成序列 echo {1..10} echo {10..1} echo {01..10} echo {01..100} echo {a..c} echo {a..z} echo {A..Z}

linux基础学习-10.1-特殊符号-分类讲解

1.重定向符号 01.> 输出重定向 先清空文件,追加 02.>> 追加输出重定向 追加 03.< 输入重定向 与 xargs tr 04.<< 追加输入重定向 cat 向一个文件追加多行. cat >>/oldboy/alex.txt<<EOF Love me, love my dog. Love Li, love li's dog. EOF 2. 表示位置的 01. .(点) 当前目录 02. .. 当前目录上一级目录 03. ~ 当前用户的

2016-2-4 linux 基础学习10

管道和重定向:> < << >> 计算机5大设备:运算器.控制器(CPU).存储器(RAM).输入设备.输出设备  程序:指令和数据地址总线:内存寻址数据总线:传输数据控制总线:控制指令寄存器:CPU暂时存储器 I/O设备:    INPUT设备:    OUTPUT设备:系统设定    默认输出设备:标准输出,STDOUT, 1    默认输入设备:标准输入,STFIN,  0    标准错误输出:STDERR, 2         标准输出:键盘    标准输出和错

linux基础学习笔记——操作大全

作者:liaoyi 更新时间:2014-6-2 ****************基本操作***************** 关机 shutdown -h now    root用户               init 0              root用户halt      root+一般用户poweroff 重启shutdown -r now    root用户init6     root用户reboot            root+一般用户 注意:1.shutdown 比较灵活,可

linux基础学习【4】

系统进程 一.什么是进程 进程 : 一个正在运行中的程序 程序被触发后,执行者的权限与属性,程序的程序码与所需数据等都会被载入内存中,操作系统会给予这个内存内的单元一个识别码 (PID). 二.查看进程 1.图形方式查看 命令:`gnome-system-monitor` 2.进程查看命令 命令:`ps` ps -A/-e 显示所有(包括不同终端不同用户)进程(PID,TTY,TIME,CMD) ps -a 当前环境中运行的进程,不包含环境信息(PID,TTY,TIME,CMD) ps -u (

c/c++unix/linux基础学习笔记-常用命令和vi的使用

linux 基本命令的使用-命令在ubuntu下面执行,有些命令通用其他linux,有些不通用. 多条命令间用;号隔开,回车后可以一起执行. clear-前屏,pwd显示当前目录,cd跳转目录. sudo [命令]  -ubuntu 下以管理员身份运行命令. 一般情况下,运行当前目录下的程序,要用 ./文件名 执行. 查看当前shell名称:ps 进入另外一个shell,直接输入shell名称:ksh/tcsh/sh/bash,退出一个shell用:exit. 切换shell命令,如:exec

Linux基础学习-crond系统计划任务

系统计划任务 大部分系统管理工作都是通过定期自动执行某个脚本来完成的,那么如何定期执行某个脚本,从而实现运维的自动化,这就要借助Linux的cron功能了. 计划任务分为一次性计划任务和周期性计划任务. 一次性计划任务 每晚11店30分开启网站服务. 周期性计划任务 每周一的凌晨3点30分把/var/www/html目录打包备份为backup.tar.gz 顾名思义,一次性计划任务只执行一次,一般用于满足临时的工作需求,可以使用at命令实现. 如果你的Linux没有此命令可以使用yum inst

linux基础学习【5】

sshd服务,服务管理及文件传输 一.控制服务 1.什么是服务 2.用什么控制服务 系统初始化进程可以进行相应的控制 3.当前系统初始化进程是什么 systemd 系统初始化进程 pstree 显示系统中的进程树 进程树 4.系统控制命令 ssh(client)客户端---->sshd(server)服务器 命令:`systemctl` systemctl status sshd 查看sshd服务的状态inactive(不可用)/active(可用) systemctl start sshd 开