sshpass详细工作记录

4s fork通过 ,但如果将buffer的大小改为40(1024大小的也会报此错),则yes过后的报错是:
Failed to add the host to the list of known hosts (/var/mobile/.ssh/known_hosts).
网上有人说:
Are you sure you want to continue connecting (yes/no)? yes Failed to add the host to the list of known hosts
只需要将.ssh/known_hosts 这个文件的权限该成644就行了
chmod 644 ~/./ssh/known_hosts
我改成了644也不行啊。


调试信息显示:
father slavept is 9 
I am the child process, my process ID is 4805 
child slavept is 4 

Failed to add the host to the list of known hosts (/var/mobile/.ssh/known_hosts).


问题已经解决,通过看Window-〉Organize-〉iDevice-〉Console可以看到设备的调试进程,可以发现我的错误在这一句:SandBox错误(具体是什么没有记下来),但是问题就是沙盒造成的,估计越狱并不是很彻底吧,所以我要拷贝Var\wl\test\1.txt被禁止了,当我把文档放到当前应用的Documents下,这些问题就没有了,所以怀疑,原来iPhone4s ios5.0.1的时候Fork老是报失败,是不是也是越狱造成的啊,但是没有环境做测试了,一切成空。



还有一种网上的说法是:

编辑/etc/ssh/sshd_config文件,确认以下设置:PasswordAuthentication yes 如果没有这项设置,则当用户使用口令而不是公钥认证时,许多ssh客户端都会出现访问拒绝。ssh_config中的注释可能导致对这一参数的误解。它说,“如禁用明文密码,设为NO!"。这里所指的"明文密码"在SSH连接隧道中然仍是加密的,因而对嗅探器(sniffer)是安全不可探测的。在这种情况下,术语“明文密码”只是意味着用户是直接输入密码还是使用密钥文件认证的区别。 在SSHD 的老版本中,该设置缺省为yes 。而在新版本中,缺省为no。因此,当服务器升级后,该设置可能被更改。而如果此时客户端仍然选用口令认证,就会出现上述问题。但我试过了,也不行。



一些unix内核代码的解释:
signal:signal( SIGCHLD,sigchld_handler );
1)凡父进程不调用wait函数族获得子进程终止状态的子进程在退出时都会变成僵尸进程。
2)SIGCHLD信号可以异步的通知父进程有子进程退出。
子进程退出时父进程会收到一个SIGCHLD信号,默认的处理是忽略这个信号,而常规的做法是在这个信号处理函数中调用wait函数获取子进程的退出状态。


posix_openpt:masterpt=posix_openpt(O_RDWR);
要求打开主设备进行读、写
打开一个可用的伪终端主设备


fcntl:fcntl(masterpt, F_SETFL, O_NONBLOCK);
fcntl()针对(文件)描述符提供控制
int fcntl(int fd, int cmd, long arg);
参数1:伪终端设备描述符,参数2:设置文件状态标记,参数3:非阻塞I/O


unlockpt:清除所有的锁标记
unlockpt( masterpt )


open :ourtty=open("/dev/tty", 0);
打开伪终端从设备
dev/tty是在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件
dev/tty是控制终端,命令”ps –ax”来查看进程与哪个控制终端相连


ptsname:const char *name=ptsname(masterpt);
找到从伪终端设备的路径名


setsid:setsid();(在fork后的子进程里运行)
Detach us from the current TTY
控制终端登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使 进程成为会话组长。这样子进程就有一个单独的pid号(wl理解)


sigemptyset(&sigmask_select);
sigemptyset(&sigmask);
sigaddset(&sigmask, SIGCHLD);
sigprocmask( SIG_SETMASK, &sigmask, NULL );


Select:int selret=select( masterpt+1, &readfd, NULL, NULL, NULL);
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式 non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。
//int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
            //参数1:maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。
            //参数2:readfd,指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否超时,若超出 timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读变化。
            //参数3:writefds 是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的写变化的,即我们关心是否可以向这些文件中写入数据了,如果这个集合中有一个文件可写,select就会返回一个大于0的值,表示有文件可写,如果没有可写的文件,则根据timeout参数再判断是否超时,若超出 timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的写变化。
            //参数4:errorfds同上面两个参数的意图,用来监视文件错误异常。
            //参数5:timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态,第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;第三,timeout的值大于0,这就是等待的超时时间,即select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。
所以上述函数的意思就是以阻塞的方式获取伪终端的读信息。

你可能感兴趣的:(sshpass详细工作记录)