首页 > 文库大全 > 精品范文库 > 14号文库

总结三种Shell脚本编程中避免SFTP输入密码的方法

总结三种Shell脚本编程中避免SFTP输入密码的方法



第一篇:总结三种Shell脚本编程中避免SFTP输入密码的方法

总结三种Shell脚本编程中避免SFTP输入密码的方法

最近编程中用到sftp上传文件,且需要用crontab预设定时上传事件。而sftp不同于ftp,没有提供选项如-i 可以将密码直接编码进程序。使用sftp指令,会自动请求用户输入密码。总结一下可以避免sftp输入密码的三种方式:1.lftp方式LFTP是一款非常著名的字符界面的文件传输工具。支持FTP、HTTP、FISH、SFTP、HTTPS和FTPS协议。例子:(本例为下载例子)[plain] view plaincopyprint?#!/bin/sh

HOST=172.16.2.X USER=kg_sftp

PASS=tnzk4a7w

echo 'Starting to sftp...' lftp-u ${USER},${PASS} sftp://${HOST} cd /kagou/datafile

mget *.*

bye

EOF

echo 'done'

2.expect方式Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。要使用expect需要预先安装tcl这个东西,然后再安装expect包。tcl:

http://prdownloads.sourceforge.net/tcl/tcl8.4.16-src.tar.gzexpect:

http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download例子:

[plain] view plaincopyprint?#!/usr/local/bin/expect-f

##procedure to attempt connecting;result 0 if OK, 1 elsewhere

proc connect {passw} {

expect {

'(yes/no)?' {send 'yes/r';exp_continue} #第一次使用SFTP时候会要求输入yes/no

'password:' {send '$passw/r'

#自动输入密码

expect {

'sftp*' {

#检测返回sftp>

return 0

}

}

}

}

# timed out

return 1

}

#read the input parameters

set user [lindex $argv 0]

set passw [lindex $argv 1]

set host [lindex $argv 2]

set location [lindex $argv 3]

set file1 [lindex $argv 4]

#puts 'Am citit:/n';

#puts 'user: $user';

#puts 'passw: $passw';

#puts 'host: $host';

#puts 'location: $location';

#puts 'file1: $file1';

#check if all were provided

if { $user == '' || $passw == '' || $host == '' || $location == '' || $file1 == '' } {

puts 'Usage:

/n'

exit 1

}

#sftp to specified host and send the files

spawn sftp $user@$host

set rez [connect $passw]

if { $rez == 0 } {

send 'cd $location/r'

set timeout-1

send 'put $file1/r'

#send 'ls-l/r'

#send 'quit/r'

#send 'mkdir testsftp/r'

send 'quit/r'

expect eof

exit 0

}

puts '/nCMD_ERR: connecting to server: $host!/n'

exit 1

0 expect也可以用两种形式调用1

./my.exp $usr $pwd $host $local $file2.代码中直接插入 expect...!3.(推荐)生成密钥对因为这种方式不用把密钥卸载程序里,所以更安全第一步:生成密匙对,我用的是rsa的密钥。使用命令 'ssh-keygen-t rsa'

[user1@rh user1]$ ssh-keygen-t rsa

Generating public/private rsa key pair.Enter file in which to save the key(/home/user1/.ssh/id_rsa):

Created directory '/home/user1/.ssh'.Enter passphrase(empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /home/user1/.ssh/id_rsa.Your public key has been saved in /home/user1/.ssh/id_rsa.pub.The key fingerprint is:

e0:f0:3b:d3:0a:3d:da:42:01:6a:61:2f:6c:a0:c6:e7user1@rh.test.com

[user1@rh user1]$ 生成的过程中提示输入密钥对保存位置,直接回车,接受默认值就行了。接着会提示输入一个不同于你的password的密码,直接回车,让它空着。

当然,也可以输入一个。(我比较懒,不想每次都要输入密码。)这样,密钥对就生成完了。

其中公共密钥保存在 ~/.ssh/id_rsa.pub 私有密钥保存在 ~/.ssh/id_rsa然后改一下.ssh 目录的权限,使用命令 'chmod 755 ~/.ssh'

[user1@rh user1]$ chmod 755 ~/.ssh 之后把这个密钥对中的公共密钥复制到你要访问的机器上去,并保存为

~/.ssh/authorized_keys

[user1@rh user1]$ scp ~/.ssh/id_rsa.pub rh1:/home/user1/.ssh/authorized_keys

user1@rh1's password:

id_rsa.pub

100% 228

3.2MB/s

00:00

[user1@rh user1]$ 之这样就大功告成了。之后再用ssh scp sftp 之类的访问那台机器时,就不用输入密码了,用在script上更是方便。原文地址:http://blog.csdn.net/hereiskxm/article/details/7861759

第二篇:网上银行登录密码框无法输入的三种截图

如您登录网银的界面登录密码无法输入,请留意是属于以下A、B、C三种情况中的哪一种:

A、密码框位置为红色的叉子,如下图:

B、密码框为白色(灰色)如下图:

C、密码框正常显示光标但无法输入:

(2)使用IE7、IE8、IE9、IE10、IE11浏览器,操作方法如下:请您打开IE浏览器—工具—Internet 选项—安全—internet—自定义级别,请您勾选“ActiveX控件自动提示”和“二进制脚本和行为”为启用,再将“对标记为可安全执行脚本的ActiveX控件执行脚本*”、“对未标记为安全执行脚本的ActiveX控件进行初始化并脚本运行”、“下载未签名的ActiveX控件”、“下载已签名控件”和“运行ActiveX控件和插件”选择为“启用或提示”,设置完毕后关闭浏览器并重启电脑即可正常输入密码。

第三篇:多文件编程方法总结

编写一个程序如下:

#include void delay(unsigned char k){

}

void main(){

}

/*此时程序较少看上去也不会觉得乱,但是如果程序很多就比较乱了。作如下多文件编程,看着方便且易于移植*/

我们需要建立如下文件,并放在同一目录下:

1.main.c 2.main.h 3.delay.c 4.delay.h

此时,main.c中写: #include #include void main(){

while(1){ } delay(100);while(1){ } delay(100);unsigned char i,j;for(i=k;i>0;i--)for(j=110;j>0;j--);} main.h中: #ifndef _main_h #define _main_h #include #include

#endif

delay.c中: #include

void delay(unsigned char k){

} unsigned char i,j;for(i=k;i>0;i--)for(j=110;j>0;j--);delay.h中: #ifndef _delay_h #define _delay_h

void delay(unsigned char k);

#endif

这样就可以实现同样的功能了。

这就是一般的格式,大家在学习的过程中可以可以直接套用.这样以后一直也很方便.

第四篇:在excel中输入身份证号码的方法

在excel中输入身份证号码的方法

2009年08月05日 星期三 13:

2118位身份证号码输入的几种解决方法

相信在EXCEL这个软件中如何输入15位或18位身份证号码的问题已经困挠了许多人,因为在EXCEL中,输入超过11位数字时,会自动转为科学计数的方式,比如身份证号是:***,输入后就变成了:1.23457E+14,要解决的方法有非常非常......多种哦,呵呵,现在为大家说几种比较简单快速的方法:

1、在A1单元输入号码时,在前面先输入’号,就

是:’***,这样单元格会默认为该单元为文本方式,会完整显示出15个号码来,而不会显示那令人讨厌的科学计数方式来了。

2、如果已经输入了大量的号码,全部以科学计数显示的话,而又懒的按照上面的方法一个一个的重新输入的话,也有这个好方法哦,比如已在单元A1:A100输入了号码,按以下步骤做:》选择单元A1:A100》单击鼠标右键,设置单元格式》选择自定义,在‘类型’中输入‘0’即可,轻松搞定,呵呵!

3、还有一种用函数来解决的方法:在A1:A100已经输入大量的号码时,在B1单元中输入:=trim(' 'a1),注意两个’之间是空格,这个公式的意思:先在A1单元15位号码前加个空格符号,然后用trim这个函数把空格符号去掉。输完后,B1单元也是显示出完整的15位数字了。

【2】在Excel中输入身份证号码的方法

1:先输入英文输入状态下的单引号“ ' ”,然后再输入即可。2:或者先选中该列或该单元格,鼠标右键,“设置单元格格式”,“数字”,“文本”,确定即可。然后输入就会正常。

在默认的情况下,Excel中每个单元格所能显示的数字为11位,超过11位的数字就会用科学计数法显示。比如123456789012,就会显示为1.234567E+11。这就为目前我们所使用的身份证号码的输入带来了不便。要解决这个问题,简单说来,就是取消这串数据的数字属性,把它们改成文本属性就可以解决问题。在此,笔者介绍几种方法实现。

在输入之前,先选中要输入身份证号码的那列,然后依次进入“格式|单元格|数字”,在“分类”中选择“文本”即可。另外一个办法就是在“分类”中选择“自定义”,然后在右边“类型”选项中选择“@”就可以了。而且根据我的经验,必须在输入号码之前就把格式定好,如果输好号码再定格式,显示还是会不正确。

【限定输入15或18位数字位数字】

如果是统一的15或18位,可以通过 菜单 数据-数据有效性-设置-

文本长度 设为15位或18位,或介于15-18位,但离你的要求还是有些差距,即无法同时满足 15位或18位的要求

第五篇:编程中内存分配总结

栈, 临时变量,大小有限制,函数返回后就被回收

堆,可以动态分配,大小可近似认为无限制,可以一直存在

堆:malloc(), free()需要自己申请与自己负责释放!适用于事先不知道需要分配多大空间的情况。

栈:void fun(int x){int y;...}系统帮你分配与释放。

/////////////////////////////////////////////////////////////////// 一个由C/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其

操作方式类似于数据结构中的栈。

2、堆区(heap)— 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回

收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的

全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另

一块区域。已初始化全局/静态变量,在整个软件执行过程中有效;.bss函数调用栈,其中的内容在函数执行期间有效,并由编译器负责分配和收回;

.heap程序结束后由系统释放。

4、文字常量区 —常量字符串就是放在这里的。程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

二、堆和栈的理论知识 2.1申请方式

stack: 由系统自动分配。例如,声明在函数中一个局部变量 int b;系统自动在栈中为b开辟空间 heap: 需要程序员自己申请,并指明大小,在c中malloc函数 如p1 =(char *)malloc(10);在C++中用new运算符 如p2 = new char[10];但是注意p1、p2本身是在栈中的。

2.2 申请后系统的响应

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢 出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表

中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的

首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。

另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部

分重新放入空闲链表中。

2.3申请大小的限制

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意

思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有 的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将

提示overflow。因此,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储 的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小

受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

2.4申请效率的比较:

栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是

直接在进程的地址空间中保留一块内存,虽然用起来最不方便。但是速度快,也最灵活。

2.5堆和栈中的存储内容

栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可

执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈 的,然后是函数中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地

址,也就是主函数中的下一条指令,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。

2.6存取效率的比较

char s1[] = “aaaaaaaaaaaaaaa”;char *s2 = “bbbbbbbbbbbbbbbbb”;aaaaaaaaaaa是在运行时刻赋值的;

而bbbbbbbbbbb是在编译时就确定的;

但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。

比如: #include void main(){ char a = 1;char c[] = “1234567890”;

char *p =“1234567890”;a = c[1];a = p[1];return;} 对应的汇编代码 10: a = c[1];

00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 0040106A 88 4D FC mov byte ptr [ebp-4],cl 11: a = p[1];

0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 00401070 8A 42 01 mov al,byte ptr [edx+1] 00401073 88 45 FC mov byte ptr [ebp-4],al 第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到

edx中,再根据edx读取字符,显然慢了。

2.7小结:

堆和栈的区别可以用如下的比喻来看出:

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。(经典!)

( )展开阅读全文 ∨

    版权声明:此文自动收集于网络,若有来源错误或者侵犯您的合法权益,您可通过邮箱与我们取得联系,我们将及时进行处理。

    本文地址:https://www.feisuxs.com/wenku/jingpin/14/1250684.html

相关内容

热门阅读

最新更新

随机推荐