|
用户名:icymoon 笔名:icymoon 地区: 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
咫尺参商,瞬间才是永恒,无须再回头,何必泪沾巾。
让时间带来忘却,
用忘却来埋葬记忆,
我微笑着参加自己记忆的葬礼...
再带着这微笑离开记忆的墓园,踏上那未知的路。
=======[ Error on read from talk daemon: Connection refused.]=========
我决定用;来结束一个句子;
但用{}还是用缩进来划分出一个文字块要看情况;
利用gm_board_info检查myrinet节点简单的perl脚本
(C) icymoon@NKU
[root@node001 maintain]# cat ./check_myri.pl
#!/usr/bin/perl
my @nodes= `/opt/xcat/gm/bin/gm_board_info | grep " node" | awk \'\{print \$3\}\' | sort`;
chomp(@nodes);
if($nodes[0] eq "")
{
print "Oh my God! There must be something wrong with myself! I can't find anyone!\n";
exit;
}
my $i = 1;
my $j = 0;
if($#nodes == 383)
{
print "I found 384 nodes and I think it's OK~~~\n";
exit;
}
while($j <= $#nodes)
{
if($i < 10)
{
if($nodes[$j] eq "node00$i")
{
$i++;
$j++;
next;
}
else
{
print "I can't find node00$i\n";
$i++;
next;
}
}
if($i < 100)
{
if($nodes[$j] eq "node0$i")
{
$i++;
$j++;
next;
}
else
{
print "I can't find node0$i\n";
$i++;
next;
}
}
if($i < 385)
{
if($nodes[$j] eq "node$i")
{
$i++;
$j++;
next;
}
else
&nbp; {
print "I can't find node$i\n";
$i++;
next;
}
}
}
年度总结
又是一个12月31日了,决定把总结写在这里...
最失败的事情:
1.没有考上中科院的研究生
2.花了一年多的时间努力从一段阴影下走出,未果
3.天气冷
做了的事情:
0.继续留在南开读书了
1.读了些书,包括武侠小说和技术书籍
2.看到了更多的人和事,意识到了社会的存在
3.能实现对母亲的一个诺言了
将要做的事情
让生活快乐地继续...
年度总结
又是一个12月31日了,决定把总结写在这里...
最失败的事情:
1.没有考上中科院的研究生
2.花了一年多的时间努力从一段阴影下走出,未果
3.天气冷
做了的事情:
0.继续留在南开读书了
1.读了些书,包括武侠小说和技术书籍
2.看到了更多的人和事,意识到了社会的存在
3.能实现对母亲的一个诺言了
将要做的事情
让生活快乐地继续...
SSS-MIN中的消息传送和控制...
SSS-MIN中的消息传送和控制... |
最近在看一点基于MIN的并行机结构,发现日本人在这方面做了不少,我觉得中国人应该在并行机方面做得更好的,至少是以后吧。 在SSS-MIN中,所有包会以相同的帧频率串行进入输入端。在处理器与MIN间有包缓冲区。而每个Switch box中只有包的一位或者少量几位,SSS-MIN像一组带交换功能的移位寄存器一样工作。SSS-MIN的基本结构如图1所示。当包的第一个flit通过MIN的各段到达输出端的时候,包的头部会被从输出端输出。 即使在非阻塞网中,要发往同一地址的包也会发生冲突。由于SSS-MIN的Switch Box中没有存储包的缓冲区,所以当冲突发生时,冲突包中的一个会被送到错误的方向去。为了解决这个问题,引入了冲突位和ACK应答机制。路由标识中有一个bit记录冲突的发生,这样的包会被看作死亡的包,不会再影响到其他包的传输。 当包到达MIN的输出端时,可以通过冲突位来判断包是否被正确传输。如果正确,回应ACK信息(ACK: acknowledge),如果不正确,回应(NAK: Not Acknowledge)消息。在一个包通过了MIN之后,相关的Switch box的状态会记录下来这个传输路径(trace),ACK和NAK消息就从这条路径返回。如果发送端收到了NAK消息,就会重传刚才因为冲突而传送错误的包。 |
无聊一把,看看Hello,World程序
昨天晚上无聊了一次,睡不着,开始在脑子里滤了一次Hello, World程序...决定今天写出来
不怕丢人,嗯。
其实,其实我喜欢这篇文章的--The True Story of Hello World~~~~:)
http://www.lisha.ufsc.br/~guto/teaching/os/exercise/hello.html
===================================================
1.C/C++
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello, World!\n");
return 1;
}
2.bash
#!/bin/bash
echo Hello, World!
3.Perl
#!/usr/bin/perl
print "Hello, World!\n";
3.Python
#!/usr/bin/python
print "Hello, world!";
4.Java
class Hello{
public static void main(String args[]) {
System.out.println("Hello world!\n");
}
}
5.»ã±à...Ôø¾»áд£¬ÏÖÔÚȷʵÏë²»ÆðÀ´ÁË
DS,ES...MOV,ADD...¶¼±äµÃûÓÐÒâÒåÁË
6.MPI -- Ò»ÆðÀ´ËµHello, World!
#include <stdio.h>
#include <math.h>
int main( int argc, char *argv[])
{
int done = 0, n, myid, numprocs, i;
double mypi, pi, h, sum, x;
double startwtime = 0.0, endwtime;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
printf("Hello,world! Process %d on %s\n",myid, processor_name);
if (myid == 0)
{
startwtime = MPI_Wtime();
}
if (myid == 0)
{
endwtime = MPI_Wtime();
printf("wall clock time = %f\n",
endwtime-startwtime);
}
MPI_Finalize();
return 0;
}
遇到的jfs的bug
日志记录:
message里的记录:
Dec 18 13:34:29 stg009 kernel: assert(newval == leaf[buddy])
Dec 18 13:34:29 stg009 kernel: ------------[ cut here ]------------
Dec 18 13:34:29 stg009 kernel: kernel BUG at jfs_dmap.c:2701!
Dec 18 13:34:29 stg009 kernel: invalid operand: 0000
Dec 18 13:34:29 stg009 kernel: nfsd iptable_filter ip_tables autofs nfs lockd sunrpc ians e1000 microcode nls_iso8859-1 jfs keybdev mousedev hid input usb-ohci usbcore ext3 jbd aic79xx mpts
Dec 18 13:34:29 stg009 kernel: CPU: 0
Dec 18 13:34:29 stg009 kernel: EIP: 0060:[<f89dd91d>] Tainted: P
Dec 18 13:34:29 stg009 kernel: EFLAGS: 00010282
Dec 18 13:34:29 stg009 kernel:
Dec 18 13:34:29 stg009 kernel: EIP is at dbJoin [jfs] 0x64 (2.4.20-31.9nks2smp)
Dec 18 13:34:29 stg009 kernel: eax: 0000001e ebx: 00000005 ecx: c03ad8a8 edx: c47a3c5c
Dec 18 13:34:29 stg009 kernel: esi: 00000054 edi: c9ac9010 ebp: 00000001 esp: c47a3cc0
Dec 18 13:34:29 stg009 kernel: ds: 0068 es: 0068 ss: 0068
Dec 18 13:34:29 stg009 kernel: Process jfsCommit (pid: 713, stackpage=c47a3000)
Dec 18 13:34:29 stg009 kernel: Stack: f89f036c f89f04b8 de8eba60 c9ac9076 00000055 c9ac9000 00000056 00000000
Dec 18 13:34:29 stg009 kernel: 00000001 f89dd403 c9ac9010 00000055 00000005 f76763b4 c9ac9010 00000001
Dec 18 13:34:29 stg009 kernel: 00000aa6 063eaaa6 00000000 00000009 063eaaa6 00000000 c9ac9000 f89dcebd
Dec 18 13:34:29 stg009 kernel: Call Trace: [<f89f036c>] .rodata.str1.1 [jfs] 0x288 (0xc47a3cc0))
Dec 18 13:34:29 stg009 kernel: [<f89f04b8>] .rodata.str1.1 [jfs] 0x3d4 (0xc47a3cc4))
Dec 18 13:34:29 stg009 kernel: [<f89dd403>] dbFreeBits [jfs] 0x272 (0xc47a3ce4))
Dec 18 13:34:29 stg009 kernel: [<f89dcebd>] dbFreeDmap [jfs] 0x43 (0xc47a3d1c))
Dec 18 13:34:29 stg009 kernel: [<f89daec9>] dbFree [jfs] 0x1a8 (0xc47a3d48))
Dec 18 13:34:29 stg009 kernel: [<f89ecba1>] txFreeMap [jfs] 0xa0 (0xc47a3d90))
Dec 18 13:34:29 stg009 kernel: [<f89d5f4c>] xtTruncate [jfs] 0xb62 (0xc47a3dc8))
Dec 18 13:34:29 stg009 kernel: [<c0152d57>] generic_commit_write [kernel] 0x3f (0xc47a3e48))
Dec 18 13:34:29 stg009 kernel: [<f89e0010>] dtSearch [jfs] 0x2d9 (0xc47a3e6c))
Dec 18 13:34:29 stg009 kernel: [<f89e7521>] __free_metapage [jfs] 0x46 (0xc47a3e80))
Dec 18 13:34:29 stg009 kernel: [<f89e7d05>] release_metapage [jfs] 0x17c (0xc47a3e8c))
Dec 18 13:34:29 stg009 kernel: [<c013c7be>] __read_cache_page [kernel] 0x4a (0xc47a3ea4))
Dec 18 13:34:29 stg009 kernel: [<f89ec8a2>] txUpdateMap [jfs] 0x1e3 (0xc47a3f60))
------------------------------------------------------------------------------------------------------------
查到的一个解释:
http://www.ussg.iu.edu/hypermail/linux/kernel/0402.1/1088.html
JFS definitely ran into some corrupt metadata. It could either be
corrupt on disk, or a memory-corruption problem. I don't know if
hardware is the cause, but you say that nothing indicates that. If it
is caused by a software bug, it would be hard to track down unless it is
repeatable. The BUG() itself should probably be replaced by something
nicer, like the first two errors reported by dbFree.
At this point the superblock should be marked dirty, so fsck should
attempt to repair the damage upon reboot. I'd like to know if you
continue to see problems.
Thanks,
Shaggy
-------------------------------------------------------------------------------------------
JFS是以NFS挂在另外一台机器S上的,S的负载不断升高,出现状态为D的进程,猜测是I/O错误,df一定会死。师兄查出是jfs的bug,继续查ing.
这种情况下init 6 或者reboot是不行的,猜测的原因是:因为系统在halt的时候要将内存内容回写硬盘,而这个bug正是由于数据dirty造成的,这就会导致halt失败...所以,只好硬件reset了。:(
相关的代码:
/* if the leaf's new value is greater than its
* buddy's value, we join no more.
*/
if (newval > leaf[buddy])
break;
assert(newval == leaf[buddy]);
关于补丁:
http://www.linuxhq.com/kernel/v2.4/23/fs/jfs/jfs_dmap.c
这个是对于2.4.23内核的,没有搜到我们用的内核的合适的补丁... 郁闷
-_-b 空调的重要性
昨天晚上去看校内中国象棋的决赛了,回到机房后看到满地狼藉,竟然是空调漏水,不得已紧急停机。
抢了同学的自行车回去,今天早上八点rash回来,在得知是空调维修人员的工作失误造成的问题后就更郁闷了。-_-b
从开机到恢复服务花了约一个小时,然后检查出一点硬件问题,定位错误,联系设备的售后服务。。。花了一个多小时! 真是个体力活......@!&#(*@&!#(
对于Cluster的维护,看来只注意到系统本身的状况还是不够的,还有其他很多因素,除了管理员之间的分工与协同(这是以前认识到的)外,还有整个机房环境,空调(温度、湿度...),嗯,应该还有清洁程度,这些在以前认识得不够。
决定应付过期末考试后整理一份详细点的维护文档出来。这种没有技术含量的无聊的活也总得有人做了。其实,早在我本科维护第一台服务器的时候,就觉得两任系统维护间的交接不够好,当时做为新手进去,完全不知道一些常规的东西或者经验性的东西,走过一些弯路。现在维护的机器需要更大的功夫,我想,完备的文档也应该是有的。
写完了带port模式的FTP客户端
终于写完了,900来行的垃圾代码,sigh,好歹能用。FC4, gcc v4的,发现bug的不论是朋友还是过客都说一声吧,谢了。
11.28我自己发现了些bug,更新一下这里。
#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEFAULT_FTP_PORT 21 extern int h_errno; char user[64]; //ftp usr char passwd[64]; //ftp passwd //ftp server address struct sockaddr_in ftp_server, local_host; struct hostent * server_hostent; int sock_control; int mode = 1; //ftp mode, 0 is PORT, 1 is PASV; //echo_off and echo_on for get usr password from stdin static struct termios stored_settings; void echo_off(void) { struct termios new_settings; tcgetattr(0,&stored_settings); new_settings = stored_settings; new_settings.c_lflag &= (~ECHO); tcsetattr(0,TCSANOW,&new_settings); return; } void echo_on(void) { tcsetattr(0,TCSANOW,&stored_settings); return; } void cmd_err_exit(char * err_msg, int err_code) { printf("%s\n", err_msg); exit(err_code); } int fill_host_addr(char * host_ip_addr, struct sockaddr_in * host, int port) { if(port <= 0 || port > 65535) return 254; bzero(host, sizeof(struct sockaddr_in)); host->sin_family = AF_INET; if(inet_addr(host_ip_addr) != -1) { host->sin_addr.s_addr = inet_addr(host_ip_addr); } else { if((server_hostent = gethostbyname(host_ip_addr)) != 0) { memcpy(&host->sin_addr, server_hostent->h_addr,\ sizeof(host->sin_addr)); } else return 253; } host->sin_port = htons(port); return 1; } int xconnect(struct sockaddr_in *s_addr, int type) { struct timeval outtime; int set; int s = socket(AF_INET, SOCK_STREAM, 0); if(s < 0) cmd_err_exit("creat socket error!", 249); //set outtime for the control socket if(type == 1) { outtime.tv_sec = 0; outtime.tv_usec = 300000; } else { outtime.tv_sec = 5; outtime.tv_usec = 0; } set = setsockopt(s, SOL_SOCKET,SO_RCVTIMEO, &outtime,sizeof(outtime)); if(set !=0) { printf("set socket %s errno:%d\n",strerror(errno),errno); cmd_err_exit("set socket", 1); } //connect to the server if (connect(s,(struct sockaddr *)s_addr,sizeof(struct sockaddr_in)) < 0) { printf("Can't connect to server %s, port %d\n",\ inet_ntoa(s_addr->sin_addr),ntohs(ftp_server.sin_port)); exit(252); } return s; } //send command to server with sock_fd int ftp_send_cmd(const char *s1, const char *s2, int sock_fd) { char send_buf[256]; int send_err, len; if(s1) { strcpy(send_buf,s1); if(s2) { strcat(send_buf, s2); strcat(send_buf,"\r\n"); len = strlen(send_buf); send_err = send(sock_fd, send_buf, len, 0); } else { strcat(send_buf,"\r\n"); len = strlen(send_buf); send_err = send(sock_fd, send_buf, len, 0); } } if(send_err < 0) printf("send() error!\n"); return send_err; } //get the server's reply message from sock_fd int ftp_get_reply(int sock_fd) { static int reply_code = 0,count=0; char rcv_buf[512]; count=read(sock_fd, rcv_buf, 510); if(count > 0) reply_code = atoi(rcv_buf); else return 0; while(1) { if(count <= 0) break; rcv_buf[count]='\0'; printf("%s",rcv_buf); count=read(sock_fd, rcv_buf, 510); } return reply_code; } int get_port() { char port_respond[512]; char *buf_ptr; int count,port_num; ftp_send_cmd("PASV",NULL,sock_control); count = read(sock_control, port_respond, 510); if(count <= 0) return 0; port_respond[count]='\0'; if(atoi(port_respond) == 227) { //get low byte of the port buf_ptr = strrchr(port_respond, ','); port_num = atoi(buf_ptr + 1); *buf_ptr = '\0'; //get high byte of the port buf_ptr = strrchr(port_respond, ','); port_num += atoi(buf_ptr + 1) * 256; return port_num; } return 0; } int rand_local_port() { int local_port; srand((unsigned)time(NULL)); local_port = rand() % 40000 + 1025; return local_port; } //connect data stream int xconnect_ftpdata() { if(mode) { int data_port = get_port(); if(data_port != 0) ftp_server.sin_port=htons(data_port); return(xconnect(&ftp_server, 0)); } else { int client_port, get_sock, opt, set; char cmd_buf[32]; struct timeval outtime; struct sockaddr_in local; char local_ip[24]; char *ip_1, *ip_2, *ip_3, *ip_4; int addr_len = sizeof(struct sockaddr); client_port = rand_local_port(); get_sock = socket(AF_INET, SOCK_STREAM, 0); if(get_sock < 0) { cmd_err_exit("socket()", 1); } //set outtime for the data socket outtime.tv_sec = 7; outtime.tv_usec = 0; opt = SO_REUSEADDR; set = setsockopt(get_sock, SOL_SOCKET,SO_RCVTIMEO, \ &outtime,sizeof(outtime)); if(set !=0) { printf("set socket %s errno:%d\n",strerror(errno),errno); cmd_err_exit("set socket", 1); } set = setsockopt(get_sock, SOL_SOCKET,SO_REUSEADDR, \ &opt,sizeof(opt)); if(set !=0) { printf("set socket %s errno:%d\n",strerror(errno),errno); cmd_err_exit("set socket", 1); } bzero(&local_host,sizeof(local_host)); local_host.sin_family = AF_INET; local_host.sin_port = htons(client_port); local_host.sin_addr.s_addr = htonl(INADDR_ANY); bzero(&local, sizeof(struct sockaddr)); while(1) { set = bind(get_sock, (struct sockaddr *)&local_host, \ sizeof(local_host)); if(set != 0 && errno == 11) { client_port = rand_local_port(); continue; } set = listen(get_sock, 1); if(set != 0 && errno == 11) { cmd_err_exit("listen()", 1); } //get local host's ip if(getsockname(sock_control,(struct sockaddr*)&local,\ (socklen_t *)&addr_len) < 0) return -1; snprintf(local_ip, sizeof(local_ip), inet_ntoa(local.sin_addr)); //change the format to the PORT command needs. local_ip[strlen(local_ip)]='\0'; ip_1 = local_ip; ip_2 = strchr(local_ip, '.'); *ip_2 = '\0'; ip_2++; ip_3 = strchr(ip_2, '.'); *ip_3 = '\0'; ip_3++; ip_4 = strchr(ip_3, '.'); *ip_4 = '\0'; ip_4++; snprintf(cmd_buf, sizeof(cmd_buf), "PORT %s,%s,%s,%s,%d,%d", \ ip_1, ip_2, ip_3, ip_4, client_port >> 8, client_port&0xff); ftp_send_cmd(cmd_buf, NULL, sock_control); if(ftp_get_reply(sock_control) != 200) { printf("Can not use PORT mode!Please use \"mode\" change to PASV mode.\n"); return -1; } else return get_sock; } } } //deal with the "list" command void ftp_list() { int i = 0,new_sock; int set = sizeof(local_host); int list_sock_data = xconnect_ftpdata(); if(list_sock_data < 0) { ftp_get_reply(sock_control); printf("creat data sock error!\n"); return; } ftp_get_reply(sock_control); ftp_send_cmd("LIST", NULL, sock_control); ftp_get_reply(sock_control); if(mode) ftp_get_reply(list_sock_data); else { while(i < 3) { new_sock = accept(list_sock_data, (struct sockaddr *)&local_host, \ (socklen_t *)&set); if(new_sock == -1) { printf("accept return:%s errno: %d\n", strerror(errno),errno); i++; continue; } else break; } if(new_sock == -1) { printf("Sorry, you can't use PORT mode. There is something wrong when the server connect to you.\n"); return; } ftp_get_reply(new_sock); close(new_sock); } close(list_sock_data); ftp_get_reply(sock_control); } //get filename(s) from user's command void ftp_cmd_filename(char * usr_cmd, char * src_file, char * dst_file) { int length, flag = 0; int i = 0, j = 0; char * cmd_src; cmd_src = strchr(usr_cmd, ' '); if(cmd_src == NULL) { printf("command error!\n"); return; } else { while(*cmd_src == ' ') cmd_src ++; } if(cmd_src == NULL || cmd_src == '\0') { printf("command error!\n"); } else { length = strlen(cmd_src); while(i <= length)//be careful with space in the filename { if((*(cmd_src+i)) !=' ' && (*(cmd_src+i)) != '\\') { if(flag == 0) src_file[j] = *(cmd_src +i); else dst_file[j] = *(cmd_src +i); j++; } if((*(cmd_src+i)) == '\\' && (*(cmd_src+i+1)) !=' ') { if(flag == 0) src_file[j] = *(cmd_src +i); else dst_file[j] = *(cmd_sr +i); j++; } if((*(cmd_src+i)) == ' ' && (*(cmd_src+i-1)) != '\\') { src_file[j] = '\0'; flag = 1; j = 0; } if((*(cmd_src+i)) == '\\' && (*(cmd_src+i+1)) == ' ') { if(flag == 0) src_file[j] = ' '; else dst_file[j] = ' '; j++; } i++; }; } if(flag == 0) strcpy(dst_file, src_file); else dst_file[j] = '\0'; } //deal with the "get" command void ftp_get(char * usr_cmd) { int get_sock, set, new_sock, i = 0; char src_file[512]; char dst_file[512]; char rcv_buf[512]; char cover_flag[3]; struct stat file_info; int local_file; int count = 0; ftp_cmd_filename(usr_cmd, src_file, dst_file); ftp_send_cmd("SIZE ", src_file, sock_control); if(ftp_get_reply(sock_control) != 213) { printf("SIZE error!\n"); return; } if(!stat(dst_file, &file_info)) { printf("local file %s exists: %d bytes\n", dst_file, (int)file_info.st_size); printf("Do you want to cover it? [y/n]"); fgets(cover_flag, sizeof(cover_flag), stdin); fflush(stdin); if(cover_flag[0] != 'y') { printf("get file %s aborted.\n", src_file); return; } } local_file = open(dst_file, O_CREAT|O_TRUNC|O_WRONLY); if(local_file < 0) { printf("creat local file %s error!\n", dst_file); return; } get_sock = xconnect_ftpdata(); if(get_sock < 0) { printf("socket error!\n"); return; } set = sizeof(local_host); ftp_send_cmd("TYPE I", NULL, sock_control); ftp_get_reply(sock_control); ftp_send_cmd("RETR ", src_file, sock_control); if(!mode) { while(i < 3) { new_sock = accept(get_sock, (struct sockaddr *)&local_host, \ (socklen_t *)&set); if(new_sock == -1) { printf("accept return:%s errno: %d\n", strerror(errno),errno); i++; continue; } else break; } if(new_sock == -1) { printf("Sorry, you can't use PORT mode. There is something wrong when the server connect to you.\n"); return; } ftp_get_reply(sock_control); while(1) { printf("loop \n"); count = read(new_sock, rcv_buf, sizeof(rcv_buf)); if(count <= 0) break; else { write(local_file, rcv_buf, count); } } close(local_file); close(get_sock); close(new_sock); ftp_get_reply(sock_control); } else { ftp_get_reply(sock_control); while(1) { count = read(get_sock, rcv_buf, sizeof(rcv_buf)); if(count <= 0) break; else { write(local_file, rcv_buf, count); } } close(local_file); close(get_sock); ftp_get_reply(sock_control); } if(!chmod(src_file, 0644)) { printf("chmod %s to 0644\n", dst_file); return; } else printf("chmod %s to 0644 error!\n", dst_file); ftp_get_reply(sock_control); } //deal with "put" command void ftp_put(char * usr_cmd) { char src_file[512]; char dst_file[512]; char send_buf[512]; struct stat file_info; int local_file; int file_put_sock, new_sock, count = 0, i = 0; int set = sizeof(local_host); ftp_cmd_filename(usr_cmd, src_file, dst_file); if(stat(src_file, &file_info) < 0) { printf("local file %s doesn't exist!\n", src_file); return; } local_file = open(src_file, O_RDONLY); if(local_file < 0) { printf("open local file %s error!\n", dst_file); return; } file_put_sock = xconnect_ftpdata(); if(file_put_sock < 0) { ftp_get_reply(sock_control); printf("creat data sock errro!\n"); return; } ftp_send_cmd("STOR ", dst_file, sock_control); ftp_get_reply(sock_control); ftp_send_cmd("TYPE I", NULL, sock_control); ftp_get_reply(sock_control); if(!mode) { while(i < 3) { new_sock = accept(file_put_sock, (struct sockaddr *)&local_host, \ (socklen_t *)&set); if(new_sock == -1) { printf("accept return:%s errno: %d\n", strerror(errno),errno); i++; continue; } else break; } if(new_sock == -1) { printf("Sorry, you can't use PORT mode. There is something wrong when the server connect to you.\n"); return; } while(1) { count = read(local_file, send_buf, sizeof(send_buf)); if(count <= 0) break; else { write(new_sock, send_buf,sizeof(send_buf)); } } close(local_file); close(file_put_sock); close(new_sock); } else { while(1) { count = read(local_file, send_buf, sizeof(send_buf)); if(count <= 0) break; else { write(file_put_sock, send_buf,count); } } close(local_file); close(file_put_sock); } ftp_get_reply(sock_control); } //call this function to quit void ftp_quit() { ftp_send_cmd("QUIT",NULL,sock_control); ftp_get_reply(sock_control); close(sock_control); } //tell the user what current directory is in the server void ftp_pwd() { ftp_send_cmd("PWD", NULL, sock_control); ftp_get_reply(sock_control); } //change the directory in the server void ftp_cd(char * usr_cmd) { char *cmd = strchr(usr_cmd, ' '); char path[1024]; if(cmd == NULL) { printf("command error!\n"); return; } else { while(*cmd == ' ') cmd ++; } if(cmd == NULL || cmd == '\0') { printf("command error!\n"); return; } else { strncpy(path, cmd, strlen(cmd)); path[strlen(cmd)]='\0'; ftp_send_cmd("CWD ", path, sock_control); ftp_get_reply(sock_control); } } //list files and directories in local host void local_list() { DIR * dp; struct dirent *dirp; if((dp = opendir("./")) == NULL) { printf("opendir() error!\n"); return; } printf("Local file list:\n"); while((dirp = readdir(dp)) != NULL) { if(strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0) continue; printf("%s\n", dirp->d_name); } } //print local current directory void local_pwd() { char curr_dir[512]; int size = sizeof(curr_dir); if(getcwd(curr_dir, size) == NULL) printf("getcwd failed\n"); else printf("Current local directory: %s\n", curr_dir); } //change local directory void local_cd(char * usr_cmd) { char *cmd = strchr(usr_cmd, ' '); char path[1024]; if(cmd == NULL) { printf("command error!\n"); return; } else { while(*cmd == ' ') cmd ++; } if(cmd == NULL || cmd == '\0') { printf("command error!\n"); return; } else { strncpy(path, cmd, strlen(cmd)); path[strlen(cmd)]='\0'; if(chdir(path) < 0) printf("Local: chdir to %s error!\n", path); else printf("Local: chdir to %s\n", path); } } void show_help() { printf("\033[32mhelp\033[0m\t--print this command list\n"); printf("\033[32mpwd\033[0m\t--print the current directory of server\n"); printf("\033[32mlist\033[0m\t--list the files and directoris in current directory of server\n"); printf("\033[32mcd [directory]\033[0m\n\t--enter of server\n"); printf("\033[32mmode\033[0m\n\t--change current mode, PORT or PASV\n"); printf("\033[32mput [local_file] \033[0m\n\t--send [local_file] to server as \n"); printf("\tif isn't given, it will be the same with [local_file] \n"); printf("\tif there is any \' \' in , write like this \'\\ \'\n"); printf("\033[32mget [remote file] \033[0m\n\t--get [remote file] to local host as \n"); printf("\tif isn't given, it will be the same with [remote_file] \n"); printf("\tif there is any \' \' in , write like this \'\\ \'\n"); printf("\033[32mlpwd\033[0m\t--print the current directory o local host\n"); printf("\033[32mllist\033[0m\t--list the files and directoris in current directory of local host\n"); printf("\033[32mlcd [directory]\033[0m\n\t--enter of localhost\n"); printf("\033[32mquit\033[0m\t--quit this ftp client program\n"); } //get user and password for login void get_user() { char read_buf[64]; printf("User(Press for anonymous): "); fgets(read_buf, sizeof(read_buf), stdin); if(read_buf[0]=='\n') strncpy(user, "anonymous", 9); else strncpy(user, read_buf, strlen(read_buf)-1); } void get_pass() { char read_buf[64]; printf("Password(Press for anonymous): "); echo_off(); fgets(read_buf, sizeof(read_buf), stdin); if(read_buf[0]=='\n') strncpy(passwd, "anonymous", 9); else strncpy(passwd, read_buf, strlen(read_buf)-1); echo_on(); printf("\n"); } //login to the server int ftp_login() { int err; get_user(); if(ftp_send_cmd("USER ", user, sock_control) < 0) cmd_err_exit("Can not send message",1);; err = ftp_get_reply(sock_control); if(err == 331) { get_pass(); if(ftp_send_cmd("PASS ", passwd, sock_control) <= 0) cmd_err_exit("Can not send message",1); else err = ftp_get_reply(sock_control); if(err != 230) { printf("Password error!\n"); return 0; } return 1; } else { printf("User error!\n"); return 0; } } //deal with user's command int ftp_usr_cmd(char * usr_cmd) { if(!strncmp(usr_cmd,"list",4)) return 1; if(!strncmp(usr_cmd,"pwd",3)) return 2; if(!strncmp(usr_cmd,"cd ",3)) return 3; if(!strncmp(usr_cmd,"put ",4)) return 4; if(!strncmp(usr_cmd,"get ",4)) return 5; if(!strncmp(usr_cmd,"quit",4)) return 6; if(!strncmp(usr_cmd,"mode",4)) return 7; if(!strncmp(usr_cmd,"llist",5)) return 11; if(!strncmp(usr_cmd,"lpwd",4)) return 12; if(!strncmp(usr_cmd,"lcd ",4)) return 13; return -1; } int start_ftp_cmd(char * host_ip_addr, int port) { int err; int cmd_flag; char usr_cmd[1024]; err = fill_host_addr(host_ip_addr, &ftp_server, port); if(err == 254) cmd_err_exit("Invalid port!",254); if(err == 253) cmd_err_exit("Invalid server address!",253); sock_control = xconnect(&ftp_server,1); if((err = ftp_get_reply(sock_control)) != 220) cmd_err_exit("Connect error!",220); do { err = ftp_login(); }while(err != 1); while(1) { printf("ftp_client>"); fgets(usr_cmd, 510, stdin); fflush(stdin); if(usr_cmd[0] == '\n') continue; usr_cmd[strlen(usr_cmd)-1] = '\0'; cmd_flag = ftp_usr_cmd(usr_cmd); switch(cmd_flag) { case 1: ftp_list(); memset(usr_cmd, '\0',sizeof(usr_cmd)); break; case 2: ftp_pwd(); memset(usr_cmd, '\0',sizeof(usr_cmd)); break; case 3: ftp_cd(usr_cmd); memset(usr_cmd, '\0',sizeof(usr_cmd)); break; case 4: ftp_put(usr_cmd); memset(usr_cmd, '\0',sizeof(usr_cmd)); break; case 5: ftp_get(usr_cmd); memset(usr_cmd, '\0',sizeof(usr_cmd)); break; case 6: ftp_quit(); exit(0); case 7: mode = (mode + 1)%2; if(mode) printf("change mode to PASV\n"); else printf("change mode to PORT\n"); break; case 11: local_list(); memset(usr_cmd, '\0',sizeof(usr_cmd)); break; case 12: local_pwd(); memset(usr_cmd, '\0',sizeof(usr_cmd)); break; case 13: local_cd(usr_cmd); memset(usr_cmd, '\0',sizeof(usr_cmd)); break; default: show_help(); memset(usr_cmd, '\0',sizeof(usr_cmd)); break; } } return 1; } //main process int main(int argc, char * argv[]) { if(argc != 2 && argc != 3) { printf("Usage: %s [port]\n",argv[0]); exit(1); } else { if(argv[2]==NULL) start_ftp_cmd(argv[1], DEFAULT_FTP_PORT); else start_ftp_cmd(argv[1], atol(argv[2])); } return 1; }
删除了计算机上的除系统自带外的所有游戏
最近的生活过于忙碌,感觉压力有些大,很多事情安排不好,丢三落四的问题更加突出。
昨天半夜胃痛,让我很faint。
今天晚上写不下去代码,打了一晚上的游戏。然后...刚才我把游戏都删除了。
最近看着所里的师兄找工作,突然觉得自己两年以后也可能面临同样的问题,那时候的我能足够优秀吗?我怀疑,我很怀疑。。。这也许又是向先生说的“胡思乱想”了吧,可是有时候我真的忍不住问自己未来是什么样子的。最近这一年多的路不顺当的事情也够多,不过也真称得上是丰富多彩了。-_-b。
所有最近要干的活(不包括英语听力的练习和看小说)都被我写纸条上贴在格子的左边,扭头看一眼,多得让我自己都觉得可怕...
写一个很小的FTP客户端
实现了一个刚刚能用的FTP端,总代码量只有600多行,FC4下通过测试。
实现了服务器上的list目录&文件,pwd查看当前目录,cd改变目录,以BINARY模式put和get文件,以及对本地的ls,cd,pwd命令。
对于传输文件的TYPE,如果用ASCII,即TYPE A,不同系统同一字符的ASCII表示可能不同,对于BINARY,即TYPE I,不同系统对字节长度可能规定不同,也可能会出错...嘿嘿
走过路过的 发现bug的 给偶留句话吧,谢谢了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <unistd.h>
#include <errno.h>
#include <dirent.h>
#include <curses.h>
#include <termios.h>
#include <sys/stat.h>
#include <fcntl.h>
#define DEFAULT_FTP_PORT 21
extern int h_errno;
char user[64];
char passwd[64];
struct sockaddr_in ftp_server, ftp_client;
struct hostent * server_hostent;
int sock_control, sock_data;
FILE * control_stream, * data_stream;
static struct termios stored_settings;
void echo_off(void)
{
struct termios new_settings;
tcgetattr(0,&stored_settings);
new_settings = stored_settings;
new_settings.c_lflag &= (~ECHO);
tcsetattr(0,TCSANOW,&new_settings);
return;
}
void echo_on(void)
{
tcsetattr(0,TCSANOW,&stored_settings);
return;
}
void cmd_err_exit(char * err_msg, int err_code)
{
printf("%s\n", err_msg);
exit(err_code);
}
int fill_server_addr(char * host_ip_addr, int port)
{
if(port <= 0 || port > 65535)
return 254;
bzero(&ftp_server, sizeof(ftp_server));
ftp_server.sin_family = AF_INET;
if(inet_addr(host_ip_addr) != -1)
{
ftp_server.sin_addr.s_addr = inet_addr(host_ip_addr);
}
else
{
if((server_hostent = gethostbyname(host_ip_addr)) != 0)
{
memcpy(&ftp_server.sin_addr, server_hostent->h_addr,\
sizeof(ftp_server.sin_addr));
}
else return 253;
}
ftp_server.sin_port = htons(port);
return 1;
}
int xconnect(struct sockaddr_in *s_addr, int type)
{
struct timeval outtime;
int set;
int s = socket(AF_INET, SOCK_STREAM, 0);
if(s < 0)
cmd_err_exit("creat socket error!", 249);
if(type == 1)
{
outtime.tv_sec = 0;
outtime.tv_usec = 300000;
}
else
{
outtime.tv_sec = 5;
outtime.tv_usec = 0;
}
set = setsockopt(s, SOL_SOCKET,SO_RCVTIMEO, &outtime,sizeof(outtime));
if(set !=0)
{
printf("set socket %s errno:%d\n",strerror(errno),errno);
cmd_err_exit("set socket", 1);
}
if (connect(s,(struct sockaddr *)s_addr,sizeof(struct sockaddr_in)) < 0)
{
printf("Can't connect to server %s, port %d\n",\
inet_ntoa(s_addr->sin_addr),ntohs(ftp_server.sin_port));
exit(252);
}
return s;
}
int ftp_send_cmd(const char *s1, const char *s2, int sock_fd)
{
char send_buf[256];
int send_err, len;
if(s1)
{
strcpy(send_buf,s1);
if(s2)
{
strcat(send_buf, s2);
strcat(send_buf,"\r\n");
len = strlen(send_buf);
send_err = send(sock_fd, send_buf, len, 0);
}
else
{
strcat(send_buf,"\r\n");
len = strlen(send_buf);
send_err = send(sock_fd, send_buf, len, 0);
}
}
if(send_err < 0)
printf("send() error!\n");
return send_err;
}
int ftp_get_reply(int sock_fd)
{
static int reply_code = 0,count=0;
char rcv_buf[512];
count=read(sock_fd, rcv_buf, 510);
if(count > 0)
reply_code = atoi(rcv_buf);
else
return 0;
while(1)
{
if(count <= 0)
break;
rcv_buf[count]='\0';
printf("%s",rcv_buf);
count=read(sock_fd, rcv_buf, 510);
}
return reply_code;
}
int get_port()
{
char port_respond[512];
char *buf_ptr;
int count,port_num;
ftp_send_cmd("PASV",NULL,sock_control);
count = read(sock_control, port_respond, 510);
if(count <= 0)
return 0;
port_respond[count]='\0';
if(atoi(port_respond) == 227)
{
buf_ptr = strrchr(port_respond, ',');
port_num = atoi(buf_ptr + 1);
*buf_ptr = '\0';
buf_ptr = strrchr(port_respond, ',');
port_num += atoi(buf_ptr + 1) * 256;
return port_num;
}
return 0;
}
int xconnect_ftpdata()
{
int data_port = get_port();
if(data_port != 0)
ftp_server.sin_port=htons(data_port);
return(xconnect(&ftp_server, 0));
}
void ftp_list()
{
int list_sock_data = xconnect_ftpdata(&ftp_server);
ftp_get_reply(sock_control);
ftp_send_cmd("LIST", NULL, sock_control);
ftp_get_reply(sock_control);
ftp_get_reply(list_sock_data);
close(list_sock_data);
ftp_get_reply(sock_control);
}
void ftp_cmd_filename(char * usr_cmd, char * src_file, char * dst_file)
{
int length, flag = 0;
int i = 0, j = 0;
char * cmd_src;
cmd_src = strchr(usr_cmd, ' ');
if(cmd_src == NULL)
{
printf("command error!\n");
return;
}
else
{
while(*cmd_src == ' ')
cmd_src ++;
}
if(cmd_src == NULL || cmd_src == '\0')
{
printf("command error!\n");
}
else
{
length = strlen(cmd_src);
while(i <= length)
{
if((*(cmd_src+i)) !=' ' && (*(cmd_src+i)) != '\\')
{
if(flag == 0)
src_file[j] = *(cmd_src +i);
else
dst_file[j] = *(cmd_src +i);
j++;
}
if((*(cmd_src+i)) == '\\' && (*(cmd_src+i+1)) !=' ')
{
if(flag == 0)
src_file[j] = *(cmd_src +i);
else
dst_file[j] = *(cmd_src +i);
j++;
}
if((*(cmd_src+i)) == ' ' && (*(cmd_src+i-1)) != '\\')
{
src_file[j] = '\0';
flag = 1;
j = 0;
}
if((*(cmd_src+i)) == '\\' && (*(cmd_src+i+1)) == ' ')
{
if(flag == 0)
src_file[j] = ' ';
else
dst_file[j] = ' ';
j++;
}
i++;
};
}
if(flag == 0)
strcpy(dst_file, src_file);
else
dst_file[j] = '\0';
}
void ftp_get(char * usr_cmd)
{
char src_file[512];
char dst_file[512];
char rcv_buf[512];
char cover_flag[3];
struct stat file_info;
int local_file;
int file_get_sock, count = 0;
ftp_cmd_filename(usr_cmd, src_file, dst_file);
ftp_send_cmd("SIZE ", src_file, sock_control);
if(ftp_get_reply(sock_control) != 213)
{
printf("SIZE error!\n");
return;
}
if(!stat(dst_file, &file_info))
{
printf("local file %s exists: %d bytes\n", dst_file, (int)file_info.st_size);
printf("Do you want to cover it? [y/n]");
fgets(cover_flag, sizeof(cover_flag), stdin);
fflush(stdin);
if(cover_flag[0] != 'y')
{
printf("get file %s aborted.\n", src_file);
return;
}
}
local_file = open(dst_file, O_CREAT|O_TRUNC|O_WRONLY);
if(local_file < 0)
{
printf("creat local file %s error!\n", dst_file);
return;
}
// ftp_send_cmd("STAT ", src_file, sock_control);
// ftp_get_reply(sock_control);
file_get_sock = xconnect_ftpdata();
ftp_send_cmd("RETR ", src_file, sock_control);
while(1)
{
count = read(file_get_sock, rcv_buf, sizeof(rcv_buf));
if(count <= 0)
break;
else
{
write(local_file, rcv_buf, count);
}
}
close(local_file);
close(file_get_sock);
ftp_get_reply(sock_control);
if(!chmod(src_file, 0644))
{
printf("chmod %s to 0644\n", dst_file);
return;
}
else
printf("chmod %s to 0644 error!\n", dst_file);
}
void ftp_put(char * usr_cmd)
{
char src_file[512];
char dst_file[512];
char send_buf[512];
struct stat file_info;
int local_file;
int file_put_sock, count = 0;
ftp_cmd_filename(usr_cmd, src_file, dst_file);
if(stat(src_file, &file_info) < 0)
{
printf("local file %s doesn't exist!\n", src_file);
return;
}
local_file = open(src_file, O_RDONLY);
if(local_file < 0)
{
printf("open local file %s error!\n", dst_file);
return;
}
file_put_sock = xconnect_ftpdata();
ftp_send_cmd("STOR ", dst_file, sock_control);
ftp_get_reply(sock_control);
ftp_send_cmd("TYPE A", NULL, sock_control);
ftp_get_reply(sock_control);
while(1)
{
count = read(local_file, send_buf, sizeof(send_buf));
if(count <= 0)
break;
else
{
write(file_put_sock, send_buf,sizeof(send_buf));
}
}
close(local_file);
close(file_put_sock);
ftp_get_reply(sock_control);
}
void ftp_quit()
{
ftp_send_cmd("QUIT",NULL,sock_control);
ftp_get_reply(sock_control);
close(sock_data);
close(sock_control);
}
void ftp_pwd()
{
ftp_send_cmd("PWD", NULL, sock_control);
ftp_get_reply(sock_control);
}
void ftp_cd(char * usr_cmd)
{
char *cmd = strchr(usr_cmd, ' ');
char path[1024];
if(cmd == NULL)
{
printf("command error!\n");
return;
}
else
{
while(*cmd == ' ')
cmd ++;
}
if(cmd == NULL || cmd == '\0')
{
printf("command error!\n");
return;
}
else
{
strncpy(path, cmd, strlen(cmd));
path[strlen(cmd)]='\0';
ftp_send_cmd("CWD ", path, sock_control);
ftp_get_reply(sock_control);
}
}
void local_list()
{
DIR * dp;
struct dirent *dirp;
if((dp = opendir("./")) == NULL)
{
printf("opendir() error!\n");
return;
}
printf("Local file list:\n");
while((dirp = readdir(dp)) != NULL)
{
if(strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0)
continue;
printf("%s\n", dirp->d_name);
}
}
void local_pwd()
{
char curr_dir[512];
int size = sizeof(curr_dir);
if(getcwd(curr_dir, size) == NULL)
printf("getcwd failed\n");
else
printf("Current local directory: %s\n", curr_dir);
}
void local_cd(char * usr_cmd)
{
char *cmd = strchr(usr_cmd, ' ');
char path[1024];
if(cmd == NULL)
{
printf("command error!\n");
return;
}
else
{
while(*cmd == ' ')
cmd ++;
}
if(cmd == NULL || cmd == '\0')
{
printf("command error!\n");
return;
}
else
{
strncpy(path, cmd, strlen(cmd));
path[strlen(cmd)]='\0';
if(chdir(path) < 0)
printf("Local: chdir to %s error!\n", path);
else
printf("Local: chdir to %s\n", path);
}
}
void show_help()
{
printf("\033[32mhelp\033[0m\t--print this command list\n");
printf("\033[32mpwd\033[0m\t--print the current directory of server\n");
printf("\033[32mlist\033[0m\t--list the files and directoris in current directory of server\n");
printf("\033[32mcd [directory]\033[0m\n\t--enter <directory> of server\n");
printf("\033[32mput [local_file] <file_name>\033[0m\n\t--send [local_file] to server as <file_name>\n");
printf("\tif <file_name> isn't given, it will be the same with [local_file] \n");
printf("\tif there is any \' \' in <file_name>, write like this \'\\ \'\n");
printf("\033[32mget [remote file] <file_name>\033[0m\n\t--get [remote file] to local host as<file_name>\n");
printf("\tif <file_name> isn't given, it will be the same with [remote_file] \n");
printf("\tif there is any \' \' in <file_name>, write like this \'\\ \'\n");
printf("\033[32mlpwd\033[0m\t--print the current directory of local host\n");
printf("\033[32mllist\033[0m\t--list the files and directoris in current directory of local host\n");
printf("\033[32mlcd [directory]\033[0m\n\t--enter <directory> of localhost\n");
printf("\033[32mquit\033[0m\t--quit this ftp client program\n");
}
void get_user()
{
char read_buf[64];
printf("User(Press <Enter> for anonymous): ");
fgets(read_buf, sizeof(read_buf), stdin);
if(read_buf[0]=='\n')
strncpy(user, "anonymous", 9);
else
strncpy(user, read_buf, strlen(read_buf)-1);
}
void get_pass()
{
char read_buf[64];
printf("Password(Press <Enter> for anonymous): ");
echo_off();
fgets(read_buf, sizeof(read_buf), stdin);
if(read_buf[0]=='\n')
strncpy(passwd, "anonymous", 9);
else
strncpy(passwd, read_buf, strlen(read_buf)-1);
echo_on();
printf("\n");
}
int ftp_login()
{
int err;
get_user();
if(ftp_send_cmd("USER ", user, sock_control) < 0)
cmd_err_exit("Can not send message",1);;
err = ftp_get_reply(sock_control);
if(err == 331)
{
get_pass();
if(ftp_send_cmd("PASS ", passwd, sock_control) <= 0)
cmd_err_exit("Can not send message",1);
else
err = ftp_get_reply(sock_control);
if(err != 230)
{
printf("Password error!\n");
return 0;
}
return 1;
}
else
{
printf("User error!\n");
return 0;
}
}
int ftp_usr_cmd(char * usr_cmd)
{
if(!strncmp(usr_cmd,"list",4))
return 1;
if(!strncmp(usr_cmd,"pwd",3))
return 2;
if(!strncmp(usr_cmd,"cd ",3))
return 3;
if(!strncmp(usr_cmd,"put ",4))
return 4;
if(!strncmp(usr_cmd,"get ",4))
return 5;
if(!strncmp(usr_cmd,"quit",4))
return 6;
if(!strncmp(usr_cmd,"llist",5))
return 11;
if(!strncmp(usr_cmd,"lpwd",4))
return 12;
if(!strncmp(usr_cmd,"lcd ",4))
return 13;
return -1;
}
int start_ftp_cmd(char * host_ip_addr, int port)
{
int err;
int cmd_flag;
char usr_cmd[1024];
err = fill_server_addr(host_ip_addr,port);
if(err == 254)
cmd_err_exit("Invalid port!",254);
if(err == 253)
cmd_err_exit("Invalid server address!",253);
sock_control = xconnect(&ftp_server,1);
if((err = ftp_get_reply(sock_control)) != 220)
cmd_err_exit("Connect error!",220);
do
{
err = ftp_login();
}while(err != 1);
while(1)
{
printf("ftp_client>");
fgets(usr_cmd, 510, stdin);
fflush(stdin);
if(usr_cmd[0] == '\n')
continue;
usr_cmd[strlen(usr_cmd)-1] = '\0';
cmd_flag = ftp_usr_cmd(usr_cmd);
switch(cmd_flag)
{
case 1:
ftp_list();
memset(usr_cmd, sizeof(usr_cmd), '\0');
break;
case 2:
ftp_pwd();
memset(usr_cmd, sizeof(usr_cmd), '\0');
break;
case 3:
ftp_cd(usr_cmd);
memset(usr_cmd, sizeof(usr_cmd), '\0');
break;
case 4:
ftp_put(usr_cmd);
memset(usr_cmd, sizeof(usr_cmd), '\0');
break;
case 5:
ftp_get(usr_cmd);
memset(usr_cmd, sizeof(usr_cmd), '\0');
break;
case 6:
ftp_quit();
exit(0);
case 11:
local_list();
memset(usr_cmd, sizeof(usr_cmd), '\0');
break;
case 12:
local_pwd();
memset(usr_cmd, sizeof(usr_cmd), '\0');
break;
case 13:
local_cd(usr_cmd);
memset(usr_cmd, sizeof(usr_cmd), '\0');
break;
default:
show_help();
memset(usr_cmd, sizeof(usr_cmd), '\0');
break;
}
}
return 1;
}
int main(int argc, char * argv[])
{
if(argc != 2 && argc != 3)
{
printf("Usage: %s <ftp server ip> [port]\n",argv[0]);
exit(1);
}
else
{
if(argv[2]==NULL)
start_ftp_cmd(argv[1], DEFAULT_FTP_PORT);
else
start_ftp_cmd(argv[1], atol(argv[2]));
}
return 1;
}
makefile我就不贴了,没什么好看的。
转载一篇ssh某个错误的解释
ssh_exchange_identification: Connection closed by remote host
But this is not a good resolvent for me ! T_T
ssh_exchange_identification: Connection closed by remote host (solved)January 07, 2005Kept getting this error message when trying to connect to my server. As usually when you google you find all kinds of pundits giving stupid answers in many a mailing list. In this case all the answers said it's a problem with the hosts.allow file or libwrap. libwrap my foot. It's just a matter of connections not being closed properly and the number of allowed connections being used up. The server in question, the one that refused to let me in, is a server that I login to on an almost daily basis. On a previous occaision I had the exact same message when I had too many upload and downloads threads running with our sftp client, so I knew straight away what the problem was. So what's the solution: sleep on it! I am serious, by the time you call your hosting companies customer support and they get around to restarting your server (which for a company like aitcom can be measured in days) the problem would have solved itself when the connections timed out. If you keep attempting to reconnect this will not happen. So close all your ssh and sftp clients and go for a walk when you come back you will find that you can login again.
|
|
今天出去逛街买衣服
因为这样的事情还是比较稀有的,所以记录一下。
买到了羽绒服和一条牛仔裤,发现天津的物价在悄悄地涨啊涨的。。。
弄丢了很喜欢的纱巾,回来的车上还在的,吃过了饭,去了实验室,走的时候发现不见了。。。笨啊:(。
最近心不静
其实从很小的时候起就很少有人给我什么压力了,只是我自己会无端地给自己压力罢了。
父母对我读研的态度也只是支持我自己的选择,其实尤其是母亲是从心底不愿意我这么累的,前些天她给我讲了她年轻的时候医生对她说过的话,那是我从未听她说起过的。而这样的问题遗传的概率很不小,或者说现在问题已经在一步步地显现出来,我不知道当时年轻的她如何面对一个名医那样的结论,但是我觉得她做得真的很好了。我却是没有母亲的坚强,我无法想像如果事情真的发生的话我的未来,父母与我的未来会是什么样子的。
我在试着把每件事情安排好,可是我发现还是很乱,确切地说,是心乱。。。我有些真的胆怯了。独自一个静坐在寝室的时候,听窗外的喧嚣,听音箱里流淌出来的乐声,惟有手中的书很难翻过一页。我试着很早的时候就骑车到本部坐在实验室,一本挨一本的书翻过去,即使WarCraft也持续玩不过半个小时...唉,状态不好,暂记如此吧。
ichat.c--IP数据包+Raw Socket实践
程序说明:
操作系统: Fedora Core 4
操作系统内核:
开发语言: C
编译器: gcc (version
概述:通过原始套接字发送自定义的协议号为254的IP数据报实现简单的聊天功能。关于IP数据包与RAW Socket的内容参见前文
声明:并不是我写程序没注释,是这个blog不许超过10w字符,所以我删除了所有注释和头文件。
==============================================================
#define MAX_CMD 1024
extern int h_errno;
struct crc_low_high
{
unsigned char low;
unsigned char high;
};
union crc_chksum
{
struct crc_low_high low_high;
short chksum;
};
void show_help()
{
printf("====================================\n");
printf("Usage: ichat\n");
printf("ichat>send
printf("ichat>help\n");
printf("ichat>quit\n");
printf("====================================\n");
}
char * get_dst_addr(char cmd_buffer[MAX_CMD])
{
static char dst_host[16]; //dstination IP address.
int k=5, m=0;
while(cmd_buffer[k] == ' ')
k++;
while((cmd_buffer[k] != ' ') && (cmd_buffer[k] != '\0'))
{
if(((cmd_buffer[k] <= '9') && (cmd_buffer[k] >= '0')) \
|| (cmd_buffer[k] == '.'))
{
dst_host[m] = cmd_buffer[k];
m++;
&nsp; k++;
}
else
{
return NULL;
}
}
return dst_host;
}
int check_sum(char cmd_buffer[MAX_CMD], int offset, int length)
{
int k;
unsigned char j;
unsigned int crc = 0;
for(k = offset; k < length; k++)
{
for(j = (unsigned char)0x80; j > 0; j>>=1)
{
if(crc&0x80)
{
crc<<1;
if(cmd_buffer[k]&j)
crc^=0x01;
crc^=0x07;
}
else
{
crc<<=1;
if(cmd_buffer[k] & j)
crc^=0x01;
}
}
}
return crc;
}
void send_cmd(char cmd_buffer[1024],int sock_send)
{
union crc_chksum msgcrc;
static char *dst_host;
struct sockaddr_in send_ip_addr;
struct hostent *host;
int size = 1280;
char chksum_msg[1280];
int offset = 5;
int n;
if((dst_host = get_dst_addr(cmd_buffer)) != NULL)
  {
bzero(&send_ip_addr,sizeof(send_ip_addr));
send_ip_addr.sin_family=AF_INET;
if(inet_addr(dst_host) != -1)
{
send_ip_addr.sin_addr.s_addr = inet_addr(dst_host);
}
else
{
host = gethostbyname(dst_host);
if(host == NULL)
{
printf("Error in gethostbyname()\n");
return;
}
memcpy((char *)&send_ip_addr.sin_addr, host->h_addr,host->h_length);
}
while(cmd_buffer[offset] == ' ')
offset++;
offset += strlen(dst_host);
while(cmd_buffer[offset] == ' ')
offset++;
msgcrc.chksum = check_sum(cmd_buffer,offset,strlen(cmd_buffer));
chksum_msg[0] = msgcrc.low_high.high;
chksum_msg[1] = msgcrc.low_high.low;
for(n = 0; n < (strlen(cmd_buffer)-offset); n++)
{
chksum_msg[2+n] = cmd_buffer[offset+n];
}
chksum_msg[2+n]='\0';
if(sendto(sock_send, chksum_msg, 2+n,0,\
(struct sockaddr *)&send_ip_addr, sizeof(struct sockaddr)) == -1)
{
printf("Send error!\n");
}
else
{
printf("ichat>send ok!\n");
}
}
else
{
printf("Bad destination address!\n");
return;
}
}
int rcv_crc_check(char rcv_msg[1280],int offset,int length)
{
union crc_chksum chkit;
chkit.chksum = check_sum(rcv_msg,offset,length);
if((chkit.low_high.high==(unsigned char)rcv_msg[20]) \
&& (chkit.low_high.low==(unsigned char)rcv_msg[21]))
return 1;
else
return 0;
}
int main(int argc, char * argv[])
{
int sock_rcv, sock_send;
struct sockaddr_in msg_from;
char cmd_buffer[MAX_CMD];
char cmd[6];
char rcv_crc_msg[1280];
int i,rcv_num,rcv_size=sizeof(struct sockaddr);
pid_t child_pid;
if((child_pid = fork()) < 0)
{
perror("fork");
exit(2);
}
if( child_pid == 0)
{
setuid(0);
sock_rcv = socket(AF_INET, SOCK_RAW, 254);
if(sock_rcv == -1)
{
perror("Creat socket for receiving messages");
exit(3);
}
while(1)
{
rcv_num = recvfrom(sock_rcv, rcv_crc_msg, 1280, 0, \
(struct sockaddr *)&msg_from, (socklen_t *)&rcv_size);
if(rcv_num < 0)
{
printf("recvfrom error~! %s errno:%d\n",strerror(errno),errno);
continue;
}
else
{
rcv_crc_msg[rcv_num]='\0';
if((rcv_crc_check(rcv_crc_msg,22,rcv_num)) == 1)
{
printf("receive from %s: %s\nichat>", \
inet_ntoa(msg_from.sin_addr),&rcv_crc_msg[22]);
fflush(stdout);
}
else
{
printf("receive from %s: but crc checksum is wrong!\n",\
&nbs; inet_ntoa(msg_from.sin_addr));
fflush(stdout);
}
}
}
close(sock_rcv);
}
else
{
setuid(0)
if((sock_send = socket(AF_INET,SOCK_RAW, 254)) < 0)
{
perror("Creat socket for sending message error\n");
printf("Kill receiving process, PID=%d\n",child_pid);
printf("Goodbye~\n");
exit(0);
}
while(1)
{
printf("ichat>");
if(fgets(cmd_buffer, MAX_CMD, stdin) != NULL)
{
fflush(stdin);
if(cmd_buffer[0] == '\n')
continue;
cmd_buffer[strlen(cmd_buffer)-1]='\0';
strncpy(cmd, cmd_buffer, 5);
cmd[5] = '\0';
if(!strncmp(cmd,"send ",5))
{
send_cmd(cmd_buffer, sock_send);
}
else if(!strncmp(cmd,"quit",4))
{
if(!kill(child_pid, 9))
{
&nbs; close(sock_send);
close(sock_rcv);
printf("Kill receiving process %d\n",child_pid);
printf("Goodbye~\n");
exit(0);
}
else
{
printf("Can not kill receiving process now!\n");
}
}
else
{
show_help();
}
}
}
}
return 1;
}
IP数据报及RAW Socket一点笔记
1.1 IP数据包的格式
IP协议把传输层送来的消息组装成IP数据包并把IP数据包传递给数据链路层。IP协议制定了统一的IP数据包格式,以消除各通信子网间的差异。
IP数据包的格式图1所示:
0 4 8 16 19 24 31(位)
版本 | 报头标长 | 服务类型 | 总长度 | ||
标识 | 标志 | 片偏移 | |||
生存时间 | 协议 | 头校验和 | |||
源IP地址 | |||||
目的IP地址 | |||||
选项 | 填充域 | ||||
数据部分 | |||||
图1 IP数据包的格式
IP数据包的第一个字段是版本字段,长度4位,表示IP协议的版本,目前主要是IPv4,下一代版本是IPv6。本程序主要针对IPv4进行数据包的发送和解析。
第二个字段是4位的报头标长(IHL),定义了以4B为一个单位的IP包的报头长度。
第三个字段是服务类型,共8位,其中包含4位的服务类型和3位的优先级子域以及1位保留位。
接下来第四个字段是2B长的总长度字段,定义了以字节为单位的数据包的总长度,IP数据包的最大长度为65535B。
第五个字段是标志字段,长16位,用于识别IP数据包的编号,以便于目的主机确认数据属于哪个分组。
第六个字段是标志字段,共3位:首位为0;第二位是禁止分片标志DF,若DF为0则可以分片,为1则意味着禁止分片;第三位是分片标志MF,若MF为1,则表示接收到的不是最后一个分片,若为0,则表示接收到的是最后一个分片。
第七个字段是片偏移字段,共13位,说明分片在整个数据包中的相对位置,是以8B为单位来计数的。
第八个字段是生存时间(TTL),共8位,设置了数据包在网络传输过程中的寿命,通常是可以经过的最多的路由跳占少数。
第九个字段是协议字段,共8位,表示使用此IP数据包的高层协议类型,在本程序中,使用254来填充。
第十个字段是16位的头校验和字段,用来存放检查报头错误的校验码。校验的范围是整个IP包的报头。
然后是各32位的源地址和目的地址,分别表示发送数据包的源主机和目的主机的IP地址。
后面是选项字段,用于控制和测试,如果使用选项字段造成了报头部分的长度不是32位整数倍的情况,则要有填充位来凑齐。
最后是IP数据包携带的数据部分。
本程序所要求的包格式如图2所示:
Ichat报文 IP报首部 校验和字段(2字节) Ichat内容
图2 ichat报文的IP数据包格式
1.2 原始套接字(Raw Socket)
套接字分为三种,流套接字(Stream Socket)、数据报套接字(Datagram Socket)和原始套接字(Raw Socket)。要进行IP数据包的接收和发送,应该使用原始套接字。
原始套接字有如下三个主要特点:
l 原始套接字可以读/写ICMP、IGMP包。
l 原始套接字可以读/写IP包,只要这些IP包的协议域不是由系统内核处理。通常系统内核只处理ICMP、IGMP、TCP和UDP几种协议,其他协议则由用户进程读/写原始套接字来实现。
l 通过原始套搠字,可以构造自己的IP包头。这样可以发送具有特殊IP头的UDP和TCP包。
1.3 Linux/Unix下原始套接字的读/写(IP包的发送与接收)
1.3.1 写原始套接字
原始套接字的写操作通常使用sendto()与sendmsg()函数。
在默认情况下,写入的数据将由系统内核填入IP包的数据域,而IP头由系统内核自动产生。如果设置了IP套接字选项,则写入的数据将从IP头的第一个字节开始填充。系统内核只负责填充IP头的校验和。如果IP的标识设置为0,则该项由系统来填充。
当包的长度大于MTU时,系统会自动进行拆包,这个过程对用户透明。
1.3.2 读原始套接字
原始套接字的读操作通常使用recvfrom()和recvmsg()函数实现。原始套接字只能接收如下数据包。
l ICMP包
l IGMP包
l 协议域不被系统内核理解的IP包。对于这些IP包,系统内核仅校验其IP版本、头校验、头长度及目的地址。
本程序属于第三种情况。
当内核收到需要传递给原始套搠字的IP包后,要检查所有进程产生的原始套接字,然后将IP包拷贝给所有匹配的原始套接字。系统采用以下原则进行匹配:
l 如果IP包的协议域是非0值,则只有原始套接字的协议域与之完全匹配,才将IP包传递给该原始套接字。
l 如果原始套接字绑定到本地IP地址上,则IP包的目的地址必须与套接字绑字的地址匹配,否则,不传递IP包给该原始套接字。
l 如果原始套接字通过connect()函数与远程IP地址连接,则IP包的源地址必须与该远程IP地址匹配,否则系统不会将IP包传递给该原始套接字。
l 如果原始套接字的协议域为0,并且没有绑定或连接到任何IP地址上,则该原始套接字将接收所有发送给原始套接字的IP包。
发现自己的英语好差 :(
昨天在网上溜达,去下载了当天的VOA听听看,结果发现第一遍的时候听不懂,基本一句也听不懂
有一年没练习过听力了,考研后至今的大半年以来,除了阅读或者翻译个别的技术资料外也鲜有英语练习,但这样的退化速度也太可怕了,然后,发现自己本来很烂的英语发音更烂了,估计完全达到了中国人和外国人都听不懂的境界了。郁闷至极。
本科时候还用这些做过练习,效果也没有昨天那么差。
。得加强练习了。减少玩游戏的时间,减少听音乐的时间好了。也不知道这么说了能不能做到。反省...
Myrinet 2000 M3-E*系列交换机工具软件 Mute 之编译
Myrinet 2000 M3-E*系列交换机工具软件 Mute 之编译
-------------------------------------------------------------
注:此文在依据官方文档实践过程中整理,仅为个人笔记,不当之处,
欢迎各位指点。 tdhlshx@yahoo.com.cn 谢谢
==============================================================
Introduction的URL:
http://www.myri.com/scs/mute/#introduction
简介:
这是一个针对Myrinet-2000 M3-E*的图形界面的诊断监测工具。图形界面使用
GNOME/GTK。显然,依赖于gm驱动的一些工具。
下面主要说明依赖于GM-2的编译过程。
下载相关源码:gm-2.1.3_Linux(原有) m3-dist mute-1.9.6
m3-dist下载地址:
http://www.myri.com/ftp/pub/m3-dist.tar.gz
mute下载地址:
http://www.myri.com/ftp/pub/mute-1.9.6.tar.gz
0.包依赖:
系统上已经安装了以下几个包:
gnome-libs-devel
gtk+-devel
gtk+
1.说明,相关的几个变量
GM_SRC_HOME:编译GM驱动的目录
MUTE_M3_HOME: 放置Mute和m3-dist源码包的目录。
GM_INSTALL: GM的安装目录
2.编译过程:
1)解压缩 tar -zvxf ...tar.gz
2)编译Mapper Tools
cd {GM_SRC_HOME}/binary
mkdir lib
ln .gm_uninstalled_libs/lib/.libs/libgm.a lib/libgm.a
cd ../mt
make all gm
3)编译m3-dist
cd $MUTE_M3_HOME/m3-dist
make gmdir={GM_SRC_HOME} mtdir={GM_SRC_HOME}/mt host-no-snmp
4)编译Mute
cd $MUTE_M3_HOME/mute-1.9.6
修改makefile,包括gnome, gm, m3-dist的路径等。否则会因为找不到相关的头
文件或者库而在编译或者链接的时候出错。
注意:官方文档里说明使用Gnu gcc 3.2或更新的版本时,编译m3-dist和Mute时候
要把makefile里的gcc改成g++,但我下载到的版本里的makefile已经写明编译
器用g++了,所以没动。顺利通过编译。
3.编译后的工作...
1) killall gm_mapper
这样做是为了释放资源,否则的话后面做gm_mapper生成交换机信息文件的时候
会报"gm_mapper_port open failed: busy"的错误
同理,gm_board_info的进程也要kill掉。
2) 通过gm_mapper生成端口等设备信息的文件,具体的参数与Introduction里讲的
有点差异,我在gm-2.1.3,mute-1.9.6的情况下,指定存储map file的路径是这
样的:
--map-file-0=<path>
Store map file for port 0 at <path>.
--map-file-1=<path>
Store map file for port 1 at <path>.
eg: gm_mapper -v --level=10 --pause --map-file-0=~/mute/mute-prot0.map
还要注意的一点是我遇到的,不要让gm_mapper把map file写在NFS上,否则
的话是得不到map file的~~~;-)
具体输出如下:
# gm_mapper -v --level=10 --pause --map-file-0=~/mute-prot0.map
I am host 00:60:dd:49:0e:8c (type 1)
55 hosts, 12 xbars per map message piece
longest route supported is 15 hops
2048 hosts and 1200 xbars max
going active on port 0
mapping port 0
created h0
looking for directly connected host
looking for first xbar
found xbar
created x0
connecting h0 port 0 to x0 port 0
looking for hosts on x0
looking for xbars on x0
found xbar on port -8
created x1
connecting x0 port -8 to x1 port 0
looking for hosts on x1
trying to match x1 timestamp 7
x1 is original
adding x1 to frontier
found xbar on port -7
created x2
connecting x0 port -7 to x2 port 0
looking for hosts on x2
trying to match x2 timestamp 9
x2 is original
adding x2 to frontier
found xbar on port -6
...............................
checking disconnected link 9 on x0
checking for new hosts on x0
checking for new hosts on x73
00:60:dd:49:0e:8c verifying port 0 (active)
在进入验证(verify)模式的时候就可以按Ctrl+C结束了。
个人建议看着*.map文件不再增大再按Ctrl+C,hehe.
这是生成的mute0.map文件:
------------------------------------------------------
; map_address 00:60:dd:49:0e:d0 map_version 4016432
h - h0
1
0 s - x0 9
address 00:60:dd:49:0e:d0
hostType 1
h - h1
1
0 s - x17 8
address 00:60:dd:49:0e:8c
hostType 1
h - h2
1
0 s - x105 8
address 00:60:dd:49:0e:05
hostType 1
...............................
--------------------------------------------------------
3) 如果你正在使用GM-2.0.6或者更新的版本,你可以在Mute显示中看到主机名。不
过这需要额外做一些事情,因为GM-2的mapper不知道主机名。而在Gm-2.0.6或更
新的版本中有{GM_SRC_HOME}/mt/tools/board_names.c的叫board_names的工具,
它可以读到gm_board_info的输出的路由表信息来查找上一步生成的*.map文件中
的mac地址并替换相应的主机名。
cd {GM_INSTALL}/bin
./gm_board_info > board_info.out
cd {GM_SRC_HOME}/mt/tools/intel_linux/
./board_name mute0.map board_info.out > map.with.hostname.map
注:mute0.map为上一步中用gm_mapper生成的映像文件。
然后,mv map.with.hostnames.map mute.map,使用替换过的带主机名
的map文件为Mute的map文件。
4) 建立mute.switches文件,其中包含了集群中每个Myrinet交换机的IP地
址,一行一个IP地址。
5) 指定mute的工作目录(就是存放mute0.map的地方)这步就要求图形界面了.
mute -w $WORK_DIR
6) 用Mute建立集群映像。
a.把mute.switches放在刚才上一步指定的Mute的工作目录下,这个文件是监视
卡的IP地址列表。这个文件以前是由"Find Switches"功能自动完成的,但由
于大多数用户都没法正常使用,所以永久性地禁掉了。
b.运行mute
su -
cd $MUTE_M3_HOME/mute-1.9.6
./mute
之后会出现两个窗口,一个是建立网络图的,一个是Mute的,第一次运行Mute
时,不允许用户去掉Run Mapper,Find Loopbacks,Write Routes,或在建立网
络图中的Find Xbars。首先必须要初始化生成集群的映像图。
运行Build,如果出错的话,先来这里找找吧。。。
http://www.myri.com/scs/mute/#troubleshooting-build
要保证运行Mute的节点能ping能你在mute.switches里的每一个IP。而且第一
次运行要在装有Myrinet卡的节点上。以后可以跑在主管理节点上,只要与
Myrinet交换机相连即可。
当build完成后,会在工作目录下出现这几个文件:
mute.map
mute.hosts
&bsp; mute.switches
mute.xbars
mute.routes
mute.state
其中,后两个为可选的。
到此为止,不打算写具体的使用了。
Windows XP+Solaris 10+FC Linux的初步安装
花了两天的时间折腾出来...
硬件:
HP Compaq d280 MT
安装顺序:
Windows XP
Solaris 10
FC
注意事项:
1.Solaris 10支持的硬件很有限,不支持声卡无所谓,不支持网卡就可以考虑不装了.
2.分驱要事先规划好,安装过程尤其要注意不要误格式化掉Solaris的分区,因为其分区ID与Linux swap的相同,都为82.
3.主分区上不能同时存在Solaris和Linux的文件系统,Solaris不支持,而我在开始没有注意到这一点,补救的方法是用RedHat的光盘引导系统,用fdisk修改了主分区的Linux分区ID.
安装过程简记:
1.分区:
改BIOS设置,从光盘起动,用Redhat光盘引导,切到控制台用fdisk进行分区.不用图形界面的分区工具是因为图形界面带的disk druid支持分区格式少.
分区如下:
Disk /dev/hda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 1 2433 19543041 c W95 FAT32 (LBA)
/dev/hda2 2434 6081 29302560 b W95 FAT32
/dev/hda3 * 6082 10945 39062016 bf Unknown
/dev/hda4 10946 19457 68372640 5 Extended
/dev/hda5 10946 13378 19543041 83 Linux
/dev/hda6 15875 19457 28780416 7 HPFS/NTFS
/dev/hda7 13379 15809 19526976 83 Linux
/dev/hda8 15810 15874 522081 82 Linux swap
Partition table entries are not in disk order
其中,hda1是Windows XP的C盘.而hda2就是"补救"后的结果了,是Windows下的D盘,本打算做Linux的根分区的.hda3则是Solaris的分区了,在用fdisk分区时候指定了分区ID为82.hda4是扩展分区.hda5做了Linux的/,hda6打算多系统公用,hda7挂Linux的/home,看起来比较奢侈了,呵呵.最后一个是Linux swap.
2.安装Windows XP
没什么好写的,嗯.
3.安装Solaris
用的是今年第8期《程序员》杂志送的光盘,只有一张,所以也没有装Documentation还有其他的软件。我也下载到了其他的盘在Fat的分区,并在安装过程中mount到了Solaris的系统上面,但是还是没有用:-(
前面的设置都不难,有一点可能会有误会,有一步让选择要从中进行引导的设备,是指要从哪里读东西进行安装,而不是要把系统安装到什么地方。
其他的只要硬件能识别就好,否则有可能导致安装异常中断。
安装完成以后,Solaris会自己创建boot loader,能引导xp+solaris双系统。这个boot loader在Solaris分区的第一个扇区(据别的文档说...)
我所遇到的问题比较郁闷,图形界面CDE起来以后,只有鼠标箭头,其它什么都没有,而且Solaris新版本不支持ctrl+alt+F?切换控制台,所以只好按Power了。起动了Java Desktop后,和浏览相关的应用程序,比如Mozilla,或者开一个终端,只出一个框中间什么也没有,然后就失去响应...所以,现在我的Solaris还只能在字符界面用 :-(
4.安装FC
这个过程对于常用Linux的人来说也没有什么好写的吧。
我遇到了这样的问题:
光盘引导之后,到Test光盘步,键盘会失去响应,我的鼠标是USB的,但键盘是PS/2的,我从BIOS里禁掉USB Controller后正常的。
5.多系统引导
我用了FC自带的grub做引导,修改/boot/grub/grub.conf如下:
========================================================
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,4)
# kernel /boot/vmlinuz-version ro root=/dev/hda5
# initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,4)/boot/grub/splash.xpm.gz
#hiddenmenu
title Fedora Core (2.6.9-1.667smp)
root (hd0,4)
kernel /boot/vmlinuz-2.6.9-1.667smp ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.9-1.667smp.img
title Fedora Core-up (2.6.9-1.667)
root (hd0,4)
kernel /boot/vmlinuz-2.6.9-1.667 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.9-1.667.img
title Windows XP
rootnoverify (hd0,0)
chainloader +1
title Solaris 10
rootnoverify (hd0,2)
makeactive
chainloader +1
=================================================================
增加了Solaris 10那项,重新起动后引导正常。
rejuct user(s)
#/usr/bin/perl
use Getopt::Std;
my $username;
my $filename;
my @users_reject;
sub show_usage()
{
print "Run this script on nkstar1 with root ,please!\n";
print "Usage: $0 -u username \n";
print " -f filename\n";
print "\"username\" is the user you want to reject,or write all the users you want to reject in \"filename\".\n";
exit 0;
}
sub error_exit($)
{
print "$_[0]\n";
exit 1;
}
sub get_opts()
{
my %opts;
getopts('u:f:',\%opts);
if((not defined($opts{'u'}))&&(not defined($opts{'f'})))
{
show_usage();
}
else
{
if(defined($opts{'u'}))
{
$username=$opts{'u'};
chomp($username);
}
if(defined($opts{'f'}))
{
$filename=$opts{'f'};
}
}
}
sub update_nis()
{
system("cd /var/yp;make");
}
my $hostname=`hostname`;
if($hostname ne "NKStar1")
{
error_exit("Run this script on nkstar1 with root ,please!");
}
get_opts();
if(defined($filename))
{
if(-e $filename)
{
@users_reject = `cat $filename`;
chomp(@users_reject);
}
else
{
error_exit("Can not find file $filename!");
}
}
if(defined($username))
{
push(@users_reject,$username);
}
my $date=`date +%s`;
open BAK_PASSWD,">/etc/passwd.$date" or die("Error in creating backup file for /etc/passwd!\n");
open CH_PASSWD,"
my @passwd_new;
my $new_line;
my $line;
while(1)
{
my $flag = 0;
$line=
if(not defined($line))
{
last;
}
print BAK_PASSWD $line;
foreach my $reject (@users_reject)
{
if($line =~ /^$reject:/)
{
my @passwd_line = split(/:/,$line);
for(my $i = 0; $i < 7; $i++)
{
if(not defined($passwd_line[$i]))
{
$passwd_line[$i]="";
}
}
$passwd_line[6] = "/sbin/nologin\n";
$new_line=join ":",@passwd_line;
&bsp; push(@passwd_new,$new_line);
print "$reject will be rejected from the system!\n";
$flag = 1;
last;
}
}
if($flag == 0)
{
push(@passwd_new,$line);
}
}
close CH_PASSWD;
close BAK_PASSWD;
`chmod 400 /etc/passwd.$date`;
print("Creat backup file /etc/passwd.$date");
open NEW_PASSWD,"+>/etc/passwd" or die("Error in open /etc/passwd to write!\n");
foreach my $wr_passwd (@passwd_new)
{
print NEW_PASSWD "$wr_passwd";
}
close NEW_PASSWD;
update_nis();
exit 0;