SSH,rsync,inotifywait

ssh认证方式:
一,正常认证:输入 user;passwd
	远程登录:ssh 192.168.1.108
	[email protected]'s password: 

	远程执行命令:ssh 172.18.6.227 ls -l /
	[email protected]'s password: 
	
	远程执行多个命令:ssh 172.18.6.227 “cd / ; ls -l ”
	[email protected]'s password: 
	
	关掉子网中所有机器:
	for i in $(seq 1 254) ; do  ssh 10.0.0.${i} reboot ; done
	
二,RSA或DSA 认证:ssh-keygen 产生私钥和私钥和公钥
	公钥:用于对消息加密;
	私钥:用于对由匹配的公用密钥编码的消息进行解密;
	原理:
		在本机A上生成私钥和公钥,把公钥拷贝到远程机器B上.(sshd能够找到的文件~/.ssh/authorized_keys)
	登录时,ssh告诉远程B的sshd服务使用RSA/DSA认证,此时,B上的sshd会生成一个随机数,
	并用相应的公钥加密后,发送给本机A。本机A收到后用相应的私钥解密,再把解密后的数发送给远端B,
	远端B确认后允许登录。
	
	 例:#ssh-keygen (默认为RSA,可以指定: -t dsa)
		Generating public/private rsa key pair. 产生公钥对
		Enter file in which to save the key (/root/.ssh/id_rsa):保存文件名 
		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:
		11:40:13:bb:32:e7:c4:e8:8c:8f:c3:14:11:f0:bc:b9 root@RD98
	(如果指定了对私钥加密的短语,以后登录时,都需要输入私钥加密短语,对私钥解密)
	
	 把公钥保存文件拷贝到远端B上,并把公钥写入到文件。cat id_rsa.pub >> ~/.ssh/authorized_keys
	(注:DSA认证时的保存文件为authorized_keys2)
	
三,用短语对私钥加密,但不用每次都输入短语。
	ssh-agent:是个守护进程(daemon),它的唯一目的就是对解密的专用密钥进行高速缓存。
	(可以在~/.bashrc中加入eval 'ssh-agent')
	ssh-add:把专用密钥添加到 ssh-agent 的高速缓存中。
	
	cd ~/.ssh/
	ssh-keygen 
	scp ./id_dsa.pub [email protected]:~/.ssh/id_dsa.tmp
	
	
CSDN CODE使用:
	1,在本地windows上生成密钥对
	cd ~/.ssh
	ssh-keygen -t rsa -C “你的邮箱地址”
	复制公钥到csdn SSH公钥管理页。
	
	2,提交代码到CSDN项目(项目地址为)
		cd workdir
		a, git init  	<--创建一个空的或重新初始化已存在的仓库。
		b, git add . 	<-- 使用当前目录树下的内容更新索引,为下一次提交作准备 
		c, git commit -m " first commit" 	<-- 记录仓库的变化
		d, git remote add 项目名 [email protected]:xxx/xxx.git  <--在远程仓库中添加项目名
		e, git push -u 项目名 master  <--提交分支到运程项目

1,Inotify文件系统事件监控
Inotify: (inotify-tools)是一种强大的、细粒度的、异步的机制.
Inotify可监控的文件系统事件有:(IN_XXX)
	access:	即文件被读取
	modify:	文件被写入
	attrib:	文件属性(时间,权限,扩展属性)被修改,如 chmod、chown、touch 等
	close_write:关闭可写文件(以可写方式打开的文件被关闭)
	close_nowrite:关闭不可写文件(以只读方式打开的文年被关闭)
	open:		文件被 open
	moved_from:文件从被监视目录移走,如 mv
	moved_to:	文件被移动到监视的目录,如 mv、cp
	create:		有新文件被创建
	delete:		文件被删除,如 rm
	delete_self:有文件或目录被删除,删除后不再监视
	move_self:文件或目录被移除,移除后不再监视。
	umount: 要监视的文件系统被 umount后,不再监视,(不指定这个选项也会监听这个事件)
	close:文件被关闭,等同于(close_write|close_nowrite)
	move:文件被移动,等同于(moved_to|moved_from)
	
命令:
	inotifywait:仅执行阻塞,等待 inotify 事件。
		可以监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等)。
		在 shell 脚本中使用 inotifywait。
	inotifywatch:收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次

	
inotify系统相关参数:
/proc 接口(限制内核内存的使用):
	/proc/sys/fs/inotify/max_queued_events
	/proc/sys/fs/inotify/max_user_instances
	/proc/sys/fs/inotify/max_user_watches
	
inotifywait使用:
		-d: 作为守护进程监视, -o:指定输出文件
		-s: 把错误信息输出到syslog模块而不是stderr
		--exclude <pattern> :忽略的文件名,常规表达式,大小写敏感
		--fromfile<file>:从文件里读要监视和排除的,每个文件名一行,@开头的为排除的。
		@<file>:排除指定的文件
		-m: 监视
		-e: 监听指定的事件
		-r: 递归循环
		-q: 安静打印
		--timefmt<fmt>:指定时间格式字符串
		--format <fmt>: %w 监视的源文件或目录名,%f:目录下发生事件的文件名,%e:事件名,逗号分隔
						%T: 当前时间(需指定时间格式)
	 inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib /home/wintest/ (|while read time file event)
	 用vi查看/home/wintest/下文件时:打印如下:
		08/04/14 22:21 /home/wintest/.i.txt.swpCREATE
		08/04/14 22:21 /home/wintest/.i.txt.swxCREATE
		08/04/14 22:21 /home/wintest/.i.txt.swxDELETE
		08/04/14 22:21 /home/wintest/.i.txt.swpDELETE
		08/04/14 22:21 /home/wintest/.i.txt.swpCREATE
		08/04/14 22:21 /home/wintest/.i.txt.swpMODIFY
		08/04/14 22:21 /home/wintest/.i.txt.swpATTRIB
		08/04/14 22:21 /home/wintest/.i.txt.swpMODIFY

Inotify原理:用户态通过三个系统调用和在返回的文件描述符上的文件I/O操作来使用
	创建 inotify 实例: int fd = inotify_init ();
	
	添加一个watch:int wd = inotify_add_watch (fd, path, mask);
	删除一个watch:int ret=inotify_rm_watch (fd, wd);
	
	从实例中读取事件:read(fd,event,count)
	struct inotify_event { //事情数据结构
        __s32           wd;             /* watch descriptor */
        __u32           mask;           /* watch mask */
        __u32           cookie;         /* cookie to synchronize two events */
        __u32           len;            /* length (including nulls) of name */
        char            name[0];        /* stub for possible name */
	};
	
2,rsync运程同步:(windows版为cwRsync)
rsync有两种工作模式:一是直接的远程同步,二时面向客户端的服务,需要配置rsync服务端
一直接同步:rsync: [选项] SRC源...	 DEST目的端
			[USER@HOST:SRC]  [USER@]HOST:DEST
二面向服务:
		rsync: [选项] [USER@]HOST::SRC...  DEST
				rsync://[USER@]HOST[:PORT]/SRC...   DEST
					 SRC	[USER@]HOST::DEST 或 rsync://[USER@]HOST[:PORT]/DEST
	服务端:rsync --daemon -config /etc/rsyncd.conf

选项说明:
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-R, --relative 使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,
将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。
-l, --links 保留软链结
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-H, --hard-links 保留硬链结
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t, --times 保持文件时间信息
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run现实哪些文件将被传输
-W, --whole-file 拷贝文件,不进行增量检测
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--max-delete=NUM 最多删除NUM个文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force 强制删除目录,即使不为空
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME IP超时时间,单位为秒
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR 在DIR中创建临时文件
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 --partial
--progress 显示备份过程
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 绑定到特定的地址
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
--blocking-io 对远程shell使用阻塞IO
--stats 给出某些文件的传输状态
--progress 在传输时现实传输过程
--log-format=formAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, --help 显示帮助信息	

rsyncd守护进程:rsyncd --daemon --config /etc/rsyncd.conf
配置文件:rsyncd.conf
		pid file = /var/run/rsyncd.pid
		uid = nobody
		gid = nobody
		max connections = 36000  #最大并发连接数量以保护服务器
		log file = /var/log/rsync.log
		transfer logging = yes
		log format = %t %a %m %f %b
		syslog facility = local3
		syslog facility = local5

		[test]
		path = /home/html
		comment = test
		list = no  #该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出
		read only = false   #该选项设定是否允许客户上载文件
		use chroot = no    #传输时chroot 到指定的path
		hosts allow = *
		hosts deny = *
		#auth users = root  #由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块
		#secrets file = /etc/rsync_root.pas   #指定一个包含定义用户名:密码对的文件,只有在"auth users"被定义时,才有作用

windows客户端:(写成两个批处理)
	上传:rsync -vzrtopg --progress --delete /cygdrive/e/synchro [email protected]::test 
	下载:rsync -vzrtopg --progress --delete [email protected]::test /cygdrive/e/synchro
	
样例:	
无任何选项:
	# rsync test.c machineB:/home/userB
		1, 只要目的端的文件内容和源端不一样,就会触发数据同步,
	rsync会确保两边的文件内容一样。
		2, 但rsync不会同步文件的“modify time”,凡是有数据同步的文件,
	目的端的文件的“modify time”总是会被修改为最新时刻的时间。
		3, rsync不会太关注目的端文件的rwx权限,如果目的端没有此文件,
	那么权限会保持与源端一致;如果目的端有此文件,则权限不会随着源端变更。
		4, 只要rsync有对源文件的读权限,且对目标路径有写权限,
	rsync就能确保目的端文件同步到和源端一致。
		5, rsync只能以登陆目的端的账号来创建文件,它没有能力保持目的端文件的输主和属组
	和源端一致。(除非你使用root权限,才有资格要求属主一致、属组一致)
-a选项:归档选项,相当于-rlptgoD (不含-H,-A,-X)
-t选项:保持文件时间信息
	# rsync -t main.c machineB:/home/userB
		1, 使用-t选项后,rsync总会想着一件事,那就是将源文件的“modify 
		time”同步到目标机器。
		2, 带有-t选项的rsync,会变得更聪明些,它会在同步前先对比两边文件的时间戳
	和文件大小,如果一致,则就认为两边文件一样,对此文件就不再采取更新动作了。
		3, 因为rsync的聪明,也会反被聪明误。如果目的端的文件的时间戳、大小和源端完全一致,
		但是内容恰巧不一致时,rsync是发现不了的。这就是传说中的“坑”!
		4, 对于rsync自作聪明的情况,解决办法就是使用-I选项。
-I,--ignore-times选项:不跳过那些有同样的时间和长度的文件
	# rsync -I main.c machineB:/home/userB
	1, -I选项会让rsync变得很乖很老实,它会挨个文件去发起数据同步。
	2, -I选项可以确保数据的一致性,代价便是速度上会变慢,因为我们放弃了“quick check”策略。
	(quick check策略,就是先查看文件的时间戳和文件大小,依次先排除一批认为相同的文件)
	3, 无论情况如何,目的端的文件的modify time总会被更新到当前时刻。
	
-v选项:
	这个选项,简单易懂,就是让rsync输出更多的信息,我们可以举一个例子:
	$ rsync -vI main.c machineB:/home/userB
	main.c
	sent 81 bytes  received 42 bytes  246.00 bytes/sec
	total size is 11  speedup is 0.09
	你增加越多的v,就可以获得越多的日志信息。

-z选项:
	这是个压缩选项,只要使用了这个选项,rsync就会把发向对端的数据先进行压缩再传输。
	对于网络环境较差的情况下建议使用。
	一般情况下,-z的压缩算法会和gzip的一样。

-r选项:循环(文件夹)
	#  rsync -r superman machineB:/home/userB

-H选项:保持硬连接
-l选项:拷贝软连接
	$ rsync -l softlink machineB:/home/userB
	使用了-l选项后,rsync会完全保持软链接文件类型,原原本本的将软链接文件复制到目的端,
	而不会“follow link”到指向的实体文件。

-L,--copy-links选项:拷贝软连接指向的实体文件(在目的端此软连接就是一个含有实体文件数据的文件)
		--copy-unsafe-links: 仅仅拷贝指向SRC路径目录树以外的链结
		--safe-links: 忽略指向SRC路径目录树以外的链结
-p选项:保留权限
-g和-o选项:保持文件的属组(group)和属主(owner)	

--delete选项,--delete-excluded选项和--delete-after选项:
	都和删除有关:
	1,–delete:如果源端没有此文件,那么目的端也别想拥有,删除之。
	(如果你使用这个选项,就必须搭配-r选项一起)
	2, –delete-excluded:专门指定一些要在目的端删除的文件。
	3, –delete-after:默认情况下,rsync是先清理目的端的文件再开始数据同步;
	如果使用此选项,则rsync会先进行数据同步,都完成后再删除那些需要清理的文件。

--exclude选项和--exclude-from选项:
		如果你不希望同步一些东西到目的端的话,可以使用–exclude选项来隐藏,
	rsync还是很重视大家隐私的,你可以多次使用–exclude选项来设置很多的“隐私”。
		如果你要隐藏的隐私太多的话,在命令行选项中设置会比较麻烦,rsync还是很体贴,
	它提供了–exclude-from选项,让你可以把隐私一一列在一个文件里,
	然后让rsync直接读取这个文件就好了。
	
-P选项: 相当于--partial --progress	
--partial选项:断点续传
	这就是传说中的断点续传功能。默认情况下,rsync会删除那些传输中断的文件,
	然后重新传输。但在一些特别情况下,我们不希望重传,而是续传。
--progress选项:显示传输进度
	
-c或--checsum: 打开校验开关,强制对文件传输进行校验		
-B或--block-size=SIZE: 设置固定的校检块大小
	
快速删除海量文件:
		1,先建一个空文件:mkdir /tmp/test
		2,用rsync删除目标目录:rsync --delete-before -a -H -v --progress --stats /tmp/test log/
			此时log目录会清空。
rsync:远程同步两处计算机的文件与目录。
	
	rdiff: 利用rsync的算法产生文件A与文件B的差量文件,差分文件可稍后被套用到文件A,
		转成文件B(类似patch公用程序)
rdiff-backup: 利用rdiff写的一个远程备份。

duplicity: rdiff-backup的变种。
	


你可能感兴趣的:(SSH,rsync,inotifywait)