第9章 使用ssh服务管理远程主机。
章节简述:
学习使用nmtui命令配置网卡参数、手工将多块网卡做绑定、使用nmcli命令查看网卡信息和使用ss命令查看网络及端口状态。
完整演示sshd服务配置方法并详细讲述每个参数的作用,实战基于密钥远程登陆实验以及用screen服务让远程会话不再终断。
本章目录结构
9.1 配置网卡连接网络
9.1.1 配置网卡参数
本实验需要两台虚拟主机来完成,分别是:
主机名称 | 操作系统 | IP地址 |
本地主机 | 红帽RHEL7操作系统 | 192.168.10.10 |
远程主机 | 红帽RHEL7操作系统 | 192.168.10.20 |
在正式配置sshd服务之前,我们必须保证本地主机与远程主机之间数据是可以互相传送的,前面在学习Vim编辑器的章节中修改过网卡文件,本次使用图形工具来配置网络,效果是一样的。
请您按照下面的幻灯片逐步操作,可点击图片两侧箭头或下方小圆点“○”切换步骤。
-
第1步:执行命令“nmtui”。
-
第2步:选择要编辑的网卡。
-
第3步:编辑网卡信息。
-
第4步:将网卡的IPv4配置项设置成手动。
-
第5步:敲击Ipv4配置项右侧的(Show)。
-
第6步:填入IP地址信息。
-
第7步:敲击最下面的(OK)。
-
第8步:确认信息填写正确后退出。
-
第9步:再次运行网卡配置程序。
-
第10步:选择激活该网卡。
-
第11步:将此网卡成功的激活。
-
第12步:通信测试。
-
第13步:请使用"nmtui"工具配置后仍然需要修改网卡配置文件设置"ONBOOT=yes"。
使用nmtui工具配置完网卡后请一定要再修改配置文件设置成"ONBOOT=yes"。
当您按照上述步骤配置完网卡后在本地主机执行"ping 192.168.10.20"来检测网络是否已经配置妥当。
9.1.2 查看网卡信息
nmcli是一款能够方便我们配置网络的工具,能够轻松的查看网卡信息或网络状态:
查看网卡的配置信息:
[root@linuxprobe ~]# nmcli connection show
NAME(网卡名称) | UUID(唯一识别码) | TYPE(网卡类型) | DEVICE(设备) |
eno16777736 | 13756690-ac77-b776-4fc1-f5535cee6f16 | 802-3-ethernet | eno16777736 |
查看网卡的连接状态:
[root@linuxprobe ~]# nmcli device status
DEVICE(设备) | TYPE(类型) | STATE(状态) | CONNECTION(连接) |
eno16777736 | ethernet | connected | eno16777736 |
lo | loopback | unmanaged | -- |
如果想看网卡设备"eno16777736"的详细信息,只需执行"nmcli con show eno16777736",信息相当详细哦!
对了!网卡还支持了简单实用的多会话功能了呢,例如将Linux系统安装到了笔记本上,上午拿到公司工作时是要指定IP地址,而晚上回到家是DHCP分配IP地址,这样改来改去真的很麻烦,所以我们可以设置多个网卡会话,在不同的环境激活就可以了,但每个网卡同时仅能有一个会话是激活状态的。
我们可以将在公司的会话叫做"company",在家里的会话叫做"house",记住了哦,现在配置!
添加公司会话,参数为connection(会话),add(添加动作),con-name(会话名称),type(网卡类型),ifname(网卡名称):
Connection 'company' (3a6677a8-59b0-4c8a-ae15-2a9f3e502f33) successfully added.
添加居家会话:
Connection 'house' (03f366a3-04b6-4545-a996-f10d7bffbf64) successfully added.
启用居家会话:
[root@linuxprobe ~]# nmcli connection up house
查看会话的信息:
[root@linuxprobe ~]# nmcli connection show
NAME(名称) | UUID(唯一标识符) | TYPE (网卡类型) | DEVICE(设备) |
house | 03f366a3-04b6-4545-a996-f10d7bffbf64 | 802-3-ethernet | -- |
company | 3a6677a8-59b0-4c8a-ae15-2a9f3e502f33 | 802-3-ethernet | -- |
eno16777736 | 13756690-ac77-b776-4fc1-f5535cee6f16 | 802-3-ethernet | eno16777736 |
实用nmcli命令创建或修改的会话配置信息回自动保存为网卡配置文件,重启后依然有效。
9.1.3 绑定两块网卡
我们可以将多块网卡多绑定操作,不仅能够提高带宽的速率而且让其中一块网卡出现故障时,不会让网络完全中断。
第1步:在虚拟机中额外添加一块网卡。
编辑虚拟机设置,添加网络适配器:
保证两块网卡的连接类型都是相同的:
查看两块网卡的名称:
[root@linuxprobe ~]# ifconfig | grep flags
eno16777728: flags=4163>UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
eno33554968: flags=4163>UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
第2步:配置网卡的参数:
设置第1块网卡为从卡,而主卡为bond0:
[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777728
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=eno16777728
MASTER=bond0
SLAVE=yes
相似的方法设置第2块网卡,主卡依然为bond0:
[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno33554968
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=eno33554968
MASTER=bond0
SLAVE=yes
创建绑定网卡的配置文件并指定IP地址等信息:
[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=bond0
IPADDR=192.168.10.10
PREFIX=24
DNS=192.168.10.1
NM_CONTROLLED=no
第3步:让内核支持Bonding的驱动。
为bond0网卡添加bonding驱动的支持:
[root@linuxprobe ~]# vim /etc/modprobe.d/bond.conf
alias bond0 bonding
options bond0 miimon=100 mode=6
常用的绑定驱动模式有:
mode=0平衡负载模式:平时两块网卡均工作,且自动备援,采用Switch支援。
mode=1自动备援模式:平时只有一块网卡工作,故障后自动替换为另外的网卡。
mode=6:平衡负载模式:平时两块网卡均工作,且自动备援,无须设置Switch支援。
第4步:重新加载网卡后绑定即成功。
重新加载网卡信息:
[root@linuxprobe ~]# systemctl restart network
bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST> mtu 1500
inet 192.168.10.10 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::20c:29ff:fe9c:637d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9c:63:7d txqueuelen 0 (Ethernet)
RX packets 700 bytes 82899 (80.9 KiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 588 bytes 40260 (39.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno16777728: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 00:0c:29:9c:63:73 txqueuelen 1000 (Ethernet)
RX packets 347 bytes 40112 (39.1 KiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 263 bytes 20682 (20.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno33554968: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 00:0c:29:9c:63:7d txqueuelen 1000 (Ethernet)
RX packets 353 bytes 42787 (41.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 325 bytes 19578 (19.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
9.1.4 查看端口状态
有经验的管理员都会在配置网卡后顺手执行一条ping命令来检测网络的可用性,并且以前大家习惯用netstat命令查看本机的端口连接状态,这条命令也已经在红帽RHEL7系统中则被效率更高、显示信息更多的ss命令替代了。
ss命令用于查看本机的端口连接状态,具体的参数:
参数 | 作用 |
-a | 显示所有的套接字 |
-l | 显示所有连接状态的套接字 |
-e | 显示详细的套接字信息 |
-m | 显示套接字的内存使用情况 |
-p | 显示套接字的进程信息 |
-4 | 显示ipv4的套接字信息 |
-6 | 显示ipv6的套接字信息 |
-t | 仅显示tcp的套接字信息 |
-u | 仅显示udp的套接字信息 |
-n | 不解析主机名(提升速度) |
-s | 查看概述 |
查看监听状态中的套接字:
[root@linuxprobe ~]# ss -ntl
State | Recv-Q | Send-Q | Local Address:Port | Peer Address:Port |
LISTEN | 0 | 100 | 127.0.0.1:25 | *:* |
LISTEN | 0 | 128 | *:55820 | *:* |
LISTEN | 0 | 100 | *:22 | *:* |
LISTEN | 0 | 128 | 127.0.0.1:631 | *:* |
LISTEN | 0 | 128 | :::60863 | *:* |
查看进程名和PID号码:
[root@linuxprobe ~]# ss -s
Total: 1091 (kernel 1173) | |||
TCP: 11 (estab 0, closed 1, orphaned 0, synrecv 0, timewait 0/0), ports 0 | |||
Transport | Total | IP | IPv6 |
* | 1173 | - | - |
RAW | 0 | 0 | 0 |
UDP | 13 | 8 | 5 |
TCP | 10 | 5 | 5 |
INET | 23 | 13 | 10 |
FRAG | 0 | 0 | 0 |
如果我们希望查看IP数据包从本机到另外一台电脑经过的路由信息,那就可以用tracepath命令啦!
这里格式非常简单:"tracepath 目标地址(域名或IP地址均可)",确实没什么可讲。
[root@linuxprobe ~]# tracepath www.linuxprobe.com
追踪从本地主机到《Linux就该这么学》的服务器中数据包经过了那些路由器,般来讲路由跳数越少,延时越低,访问速度越快哦!
出现问题?大胆提问!
因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~
Linux技术交流请加A群:560843(满),B群:340829(推荐),点此查看全国群。
*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。
9.2 远程控制服务
9.2.1 了解sshd服务
SSH(Secure Shell)是一种能够提供安全远程登陆会话的协议,假如希望在远程Linux系统中执行命令,就是通过这个协议啦!
为什么要强调SSH协议是安全的呢?因为比如ftp、telnet等服务在网络上不会对口令或数据进行加密,那么骇客们真的非常容易就可以截获这些信息(尤其是同局域网内的用户),因此它们在本质是就是不安全的。
sshd服务提供两种安全验证的方法:
基于口令的安全验证:经过验证帐号与密码即可登陆到远程主机。
基于密钥的安全验证:需要在本地生成"密钥对"后将公钥传送至服务端,进行公共密钥的比较。
sshd服务的配置文件解析:
[root@linuxprobe ~]# cat /etc/ssh/sshd_config
参数 | 作用 |
#Port 22 | 默认的sshd服务端口。 |
#ListenAddress 0.0.0.0 | 设定sshd服务端监听的IP地址。 |
#Protocol 2 | SSH协议的版本号。 |
#HostKey /etc/ssh/ssh_host_key | SSH协议版本为1时,私钥存放的位置。 |
HostKey /etc/ssh/ssh_host_rsa_key | SSH协议版本为2时,RSA私钥存放的位置。 |
#HostKey /etc/ssh/ssh_host_dsa_key | SSH协议版本为2时,DSA私钥存放的位置。 |
#PermitRootLogin yes | 设定是否允许root用户直接登录。 |
#StrictModes yes | 当远程用户私钥改变时则直接拒绝连接。 |
#MaxAuthTries 6 | 最大密码尝试次数 |
#MaxSessions 10 | 最大终端数 |
#PasswordAuthentication yes | 是否允许密码验证 |
#PermitEmptyPasswords no | 是否允许空密码登陆(很不安全) |
若您想要修改服务的配置参数,请一定要记得删除参数前面的注释符"#"并重启服务才生效的。
在远程主机上启动sshd服务并加入到开机启动项:
[root@localhost ~]# systemctl start sshd
[root@localhost ~]# systemctl enable sshd
9.2.2 使用ssh命令
ssh命令用于远程管理Linux主机,格式为:“ssh [参数] 主机”。
参数 | 作用 |
-p | 指定连接端口(默认为22) |
-v | 显示连接过程的详细信息 |
[root@localhost ~]# ssh 192.168.10.20
The authenticity of host '192.168.10.20 (192.168.10.20)' can't be established.
ECDSA key fingerprint is 4f:a7:91:9e:8d:6f:b9:48:02:32:61:95:48:ed:1e:3f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.20' (ECDSA) to the list of known hosts.
root@192.168.10.20's password:此处输入远程主机root用户的密码
Last login: Wed Apr 15 15:54:21 2015 from 192.168.10.10
[root@localhost ~]#
9.2.3 安全密钥验证
使用密码验证终归会存在着被骇客暴力破解或嗅探监听的危险,其实也可以让ssh服务基于密钥进行安全验证(可无需密码验证)。
第1步:在本地主机中生成“密钥对”并将公钥传送到远程主机中:
[root@linuxprobe ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):回车或设置密钥的存储路径
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 回车或设置密钥的密码
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
40:32:48:18:e4:ac:c0:c3:c1:ba:7c:6c:3a:a8:b5:22 root@linuxprobe.com
The key's randomart image is:
+--[ RSA 2048]----+
|+*..o . |
|*.o + |
|o* . |
|+ . . |
|o.. S |
|.. + |
|. = |
|E+ . |
|+.o |
+-----------------+
将生成好的公钥密钥传送至远程主机:
[root@linuxprobe ~]# ssh-copy-id 192.168.10.20
The authenticity of host '192.168.10.20 (192.168.10.20)' can't be established.
ECDSA key fingerprint is 4f:a7:91:9e:8d:6f:b9:48:02:32:61:95:48:ed:1e:3f.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.10.20's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '192.168.10.20'"
and check to make sure that only the key(s) you wanted were added.
第2步:首先要在远程主机中修改sshd服务的配置文件(修改后记得重启服务):
请您按照下面的幻灯片逐步操作,可点击图片两侧箭头或下方小圆点“○”切换步骤。
-
第1步:编辑ssh服务程序主配置文件。
-
第2步:将允许密码验证的参数设置为no。
-
第3步:将允许密钥验证的参数设置为yes。
-
第4步:保存并退出配置文件。
-
第5步:重启ssh服务程序后即可生效。
第3步:最后来尝试无需密码的远程登录吧:
[root@linuxprobe ~]# ssh 192.168.10.20
Last login: Mon Apr 13 19:34:13 2015
9.2.4 远程传输命令
要想将一些文件通过网络传送给其他主机,又恰好两台主机都是Linux系统,我们便可以直接用scp命令传输文件到另外一台主机~
scp命令用于在网络中安全的传输文件,格式为:“scp [参数] 本地文件 远程帐户@远程IP地址:远程目录”。
参数 | 作用 |
-v | 显示详细的连接进度 |
-P | 指定远程主机的sshd端口号 |
-r | 传送文件夹时请加此参数 |
-6 | 使用ipv6协议 |
将本地文件/root/out.txt传送到远程主机的/home目录:
[root@linuxprobe ~]# scp /root/out.txt 192.168.10.20:/home
root@192.168.10.20's password:此处输入远程主机中root用户的密码
out.txt 100% 0 0.0KB/s 00:00
传送下文件夹并指定远程用户:
[root@linuxprobe ~]# scp -r results/ linuxprobe@192.168.10.20:/home
linuxprobe@192.168.10.20's password:此处输入远程主机中linuxprobe用户的密码
强大的scp命令还可以将远程主机的文件传输到本地呢,格式为"scp [参数] 远程用户@远程IP地址:远程文件 本地目录"。
将远程主机的/etc/issue.net文件下载到本地的/root目录:
[root@linuxprobe ~]# scp linuxprobe@192.168.10.20:/etc/issue.net /root
linuxprobe@192.168.10.20's password:
issue.net 100% 22 0.0KB/s 00:00
9.3 不间断会话服务
9.3.1 了解Screen服务
学完了ssh服务后有没有发现一个很重要的事情——当连接的终端被关闭时,运行在服务器上的命令也会中断。如果有长时间文件备份或FTP传输等任务时,通常我们都会新开一个连接窗口再继续工作,并且中途不能关闭窗口或断开链接(也包括网络不稳定的情况),否则这个任务就会被中断,还要重新开始。
Screen便是为了解决上述问题而设计的,用户可以通过使用Screen命令同时控制多个命令行会话并自由切换,特点有:
会话恢复:即便网络中断,也可让会话随时恢复,用户不会失去对命令行的控制。
多窗口:每个会话都是独立运行的,拥有独立的编号、输入输出和窗口缓存。
会话共享:可以使多个用户从不同终端使用同一个会话,也可让他们看到完全相同的输出。
9.3.2 掌握命令参数
红帽RHEL7系统中默认没有包含screen,需要先来安装。
使用yum命令安装screen程序包:
[root@linuxprobe ~]# yum install screen
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分安装信息………………
Installing:
screen x86_64 4.1.0-0.19.20120314git3c2946.el7 rhel7 551 k
………………省略部分安装信息………………
Complete!
screen命令的常用命令参数包括:
参数 | 作用 |
-A | 让所有视窗自动调整适应当前终端机的大小。 |
-d <会话名称> | 将指定的screen会话离线。 |
-r<会话名称> | 将指定的screen会话恢复。 |
-h<行数> | 指定视窗的缓冲区行数。 |
-S<会话名称> | 指定screen会话的名称 |
-x | 恢复所有离线的会话。 |
-ls或-list | 显示当前的screen会话。 |
--wipe | 自动将无法使用的screen会话删除。 |
9.3.3 创建与使用会话功能
完成安装后直接运行screen即可使用服务,推荐为每个会话都取一个名字,方便分辨。
创建名称为backup的会话:
[root@linuxprobe ~]# screen -S backup
查看当前已经存在的会话:
[root@linuxprobe ~]# screen -ls
There is a screen on:
32230.backup (Attached)
1 Socket in /var/run/screen/S-root.
当执行screen命令后会调用系统默认的shell(通常即bash),所以敲完screen命令后会立即返回一个命令提示符,虽然看起来与刚刚没有变化,但此时你已经进入screen会话啦!
创建一个会话,初始为用vim编辑器写文件:
[root@linuxprobe ~]# screen vim memo.txt
退出vim后会话也会被自动被删除:
[root@linuxprobe ~]# screen -ls
There is a screen on:
32230.backup (Attached)
1 Socket in /var/run/screen/S-root.
新建一个叫做linuxprobe的会话:
[root@linuxprobe ~]# screen -S linuxprobe
列出当前所有会话(有两个哦):
[root@linuxprobe ~]# screen --ls
There are screens on:
32403.linuxprobe (Attached)
32230.backup (Attached)
2 Sockets in /var/run/screen/S-root.
回到backup会话中:
[root@linuxprobe ~]# screen -r backup
将linuxprobe会话离线:
[root@linuxprobe ~]# screen -d linuxprobe
[remote detached from 32403.linuxprobe]
再次查看会话状态(linuxprobe已经被离线了):
[root@linuxprobe ~]# screen -ls
There are screens on:
32403.linuxprobe (Detached)
32230.backup (Attached)
2 Sockets in /var/run/screen/S-root.
将当前会话离线并回到linuxprobe会话中:
[root@linuxprobe ~]# screen -d -r linuxprobe
[32403.linuxprobe detached.]
回到linuxprobe会话后,状态又改变了:
[root@linuxprobe ~]# screen -ls
There are screens on:
32403.linuxprobe (Attached)
32230.backup (Attached)
2 Sockets in /var/run/screen/S-root.
总结来说:将screen会话甚至为暂时断开(detach),那么会话窗口中的程序依然会执行。随后将会话重新连接(attach),那么即可重新控制会话窗口中运行的程序啦。
9.3.4 会话共享功能
会话共享功能是一件很酷的事,它让多个用户同时使用某一个会话,甚至让您和对方看到相同的终端内容,拓扑如下:
将两台Linux主机均连入同一个服务器:
在主机A的终端上执行创建会话的操作:
[root@linuxprobe ~]# screen -S linuxprobe
在主机B的终端上同步会话信息:
[root@linuxprobe ~]# screen -x
那么此时终端A与终端B上做的任何操作,都可以实时同步到对方的屏幕上,真的很酷哦!
第9章 使用ssh服务管理远程主机。的更多相关文章
- 《Linux就该这么学》培训笔记_ch09_使用ssh服务管理远程主机
<Linux就该这么学>培训笔记_ch09_使用ssh服务管理远程主机 文章最后会post上书本的笔记照片. 文章主要内容: 配置网络服务 远程控制服务 不间断会话服务 书本笔记 配置网络 ...
- Linux 就该这么学 CH09 使用ssh服务管理远程主机
1 .配置网络服务 1)配置网络参数 五种配置网络的方法:命令行,编译网络配置文件,nmtui(旧版ui界面),nm-connection-edit(新版ui),VM虚拟机右上角图标等. 这里配 ...
- 在VMware下进行的使用ssh服务管理远程主机
基于密钥的安全验证--sshd服务的配置文件解析(两台linux) 首先你有两台虚拟机 并且能够ping通(该实验的目的是通过客户端访问服务端) 打开终端进入到这个界面 看一下服务 如果有这三个服 ...
- 使用ssh服务管理远程主机
- windows上SSH服务连接远程主机失败
putty连接出现错误提示"Network error:connection refused",xshell连接出现错误提示"connection failed:(por ...
- Linux命令应用大词典-第23章 进程和服务管理
23.1 ps:报告当前进程的快照 23.2 top:显示当前正在运行的进程 23.3 pgrep:按名称和其他属性查找进程 23.4 pidof:查找正在运行的进程的进程号 23.5 pstree: ...
- Linux下 SSH远程管理服务
第1章 SSH基本概述 1.1 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Working Group )制定 在进 ...
- 五.ssh远程管理服务
01. 远程管理服务知识介绍 1) SSH远程登录服务介绍说明 SSH是Secure Shell Protocol的简写,由 IETF 网络工作小组(Network Working Group)制定: ...
- Linux(11):期中架构(3)--- SSH远程管理服务 & ansible 批量管理服务
SSH远程管理服务 1. 远程管理服务知识介绍 # 1.1 SSH远程登录服务介绍说明 SSH是Secure Shell Protocol的简写,由 IETF 网络工作小组(Network Worki ...
随机推荐
- Node基础:域名解析DNS(ok)
写在前面 Nodejs学习手册,基础总结之DNS模块.对从事web开发的同学来说,DNS解析再熟悉不过,在nodejs中也有一个模块可以完成dns解析的工作,使用非常简单.直接进入主题. 域名解析:d ...
- 导出EXCEL【Web方式HTML通过拼接html中table】
DataTable dt= GetTaskList(int.MaxValue); StringBuilder table = new StringBuilder(); table.Append(&qu ...
- 第二十五课:jQuery.event.trigger的源码解读
本课主要来讲解jQuery.event.trigger的源码解读. trigger = function(event, data, elem, onlyHandlers){ if(elem & ...
- SDAutolayout图片大小根据数量变化
只需要在自定义的PhotoContainerView中做一下判断就可以了 ) { [self setupAutoWidthFlowItems:[temp copy] withPerRowItemsCo ...
- offsetLeft, offsetTop以及postion().left , postion().top有神马区别
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- scanf的一些技巧
一.scanf和gets 1.不同点: char string[50]; scanf("%s",string); //当遇到回车,空格和tab键会自动在字符串后面添加'\0',但是 ...
- Java编程思想学习(七) 抽象类和接口
1.抽象类和抽象方法 抽象方法:不完整的,仅有声明而没有方法体. abstract void f(); 抽象类:包含抽象方法的类.(若一个类包含一个或多个抽象方法,则该类必须限定为抽象的.) 1.用抽 ...
- Bringing up interface eth0: Error:Connection activation failed:Device not managed by NetworkManager
Just follow the below steps and everything will be ok... 1. Remove Network Manager from startup Se ...
- ubuntu设置开机启动图形应用程序,替换默认图形桌面
直接将启动程序放在rc.local即可.但是如果自动启动的程序奔溃后,会返回到ubuntu的unity桌面系统. 我遇到的问题是程序还有调用 xset 去定时关闭屏幕.在桌面启动后调用没问题.如果rc ...
- 学习笔记-Kuaihu(仿知乎日报)
本文目的:由于第一次学习较为完整的项目,故作记录以系统地整理APP开发知识 先看看整个项目结构: activity, fragment, 不用说了.可以看做MVC中的controller db, 存储 ...