[Windows] Cygwin - Unix-like env
由於覺得windows 的 cmd 真是太醜了,font 又改不太起來,最後找著找著竟又找回了Linux。
cygwin 是一堆dll檔兜起來的類Unix/linux環境,支援的東西真是不少,至少我目前玩到的tmux(要裝) ncurses socket都找的到,當然,有個vim可以用,超爽的。
http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?topic_id=47282 這網頁有介紹及載點
來講講使用上的感想 心得好了
我已經決定捨棄pietty了,在cygwin裝了openssh後不僅取代了pietty的ssh還附贈了scp可以用,從今以後,我不用再用圖形化介面開ftp(檔案總管)下載了,直接command line下指令,方便!
另外當然就是自己寫的各種東西啦,socket甚至不用裝就有支援,(ncurses還是要裝一下),之前寫的program都run得起來,更浪漫的是script也可以!
所以根本就是無痛轉換啦,vimrc bashrc profile tmux的setting 啦,全部複製過來就可以用了,家目錄的bin再過來,這windows根本就我的天下,哈哈哈,難用的cmd,再見了!
其中啊,有個cygwindrive,就是共用資料夾,連到c槽及d槽,所以如果你家目錄建在c,可以類似無窮迴圈般一直開門開門,開開開開開下去@@(離題了)
我覺得如果寫程式沒有太多的linux環境需求,用這個就可以取代虛擬機了,不過可惜的是也不是全部的指令都有,所以如果要完全掌握linux,只玩cygwin還是不足的。
好像可以支援創多帳號,並從遠端連到windows的cygwin bash shell,我目前可能還不去碰這塊,因為沒有需求,cygwin也還不是很熟。
不過說到帳號,cygwin剛建起來,是以windows使用者名稱創家目錄,又可能是因為寫給個人電腦軟體的關係,並沒有登入畫面,於是我就自己刻了一個,還蠻好玩的哩!
以下的getch是網友刻的getch( ncurses的要iniscr() 太難用了 ) 為了達到有**效果,所以才找了網上大神的code一用
來源 http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?topic_id=52978
// input.c
#include <termios.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>
int getch(void)
{
int c=0;
struct termios org_opts, new_opts;
int res=0;
/*---- store old settings ----*/
res=tcgetattr(STDIN_FILENO, &org_opts);
assert(res==0);
/*---- set new terminal parms ----*/
memcpy(&new_opts, &org_opts, sizeof(new_opts));
//ECHOPRT lost
new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOKE | ICRNL);
tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);
c=getchar();
/*---- restore old settings ----*/
res=tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);
assert(res==0);
return c;
}
然後我接著寫
//login.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"input.c"
#define N 15
int main(void){
char pw0[N]="password";
char pw1[N]="PASSWORD";
char input[N];
char ch;
int i=0;
while(1){
printf("Password:");
while(1){
ch = getch();
if( i != 0 ){
if( ch == 127 ){ i--; printf("\b \b"); }//basckspace
if( ch == 21 )// kill char
{ for( ; i > 0 ; i-- ) printf("\b \b"); }
}
if( i < N ){
if( ch == '\n' ) { input[i]=0; puts(""); break; }
else if( ch != 127 && ch != 21) { input[i++]=ch; printf("*"); }
}
}
if(!strcmp(input,pw0)) break;
if(!strcmp(input,pw1)) break;
i = 0;
}
return 0;
}
這個看要塞 /etc/bash.bashrc 或家目錄 ~/.bash_profile 或 ~/.basrc 或 ~/.profile 都可以(就讓這些其中一個script執行login.sh || login.exe),甚至我寫了login.sh來自訂登入訊息 讓cygwin用起來更有fu~~
(註解掉的部分 是之前沒寫login.exe 直接用login.sh做登入密碼用)
//login.sh
#!/bin/bash
function check {
stty echo
if [ $pass -eq 0 ];then
kill -9 $PPID
fi
}
pass=0
#trap "stty echo; kill -9 $PPID" SIGINT
trap check EXIT
#stty -echo
#echo -e "Password:\c"
#while read line
#do
# if [ $line == "PASSWORD" -o $line == "password" ];then
# stty echo
/etc/login.exe #new add
if [ ! $? -eq 0 ];then #new add
kill -9 $PPID #new add
fi #new add
pass=1
# echo -e "\n"
echo -e "Welcome back, 大幹一場吧 !"
cat ~/bin/.logout_info.txt
nslookup benson 2> /dev/null | grep "Address" | grep "fec" > /dev/null
if [ $? -eq 0 ];then
echo -e "Last login: `date` from 127.0.0.1 :)" > ~/bin/.logout_info.txt
else
echo -e "Last login: `date` from `nslookup benson 2> /dev/null | grep \"Address\"` :)" > ~/bin/.logout_info.txt
fi
exit
# fi
# echo -e "\nPassword:\c"
#done < "${1:-/dev/stdin}"
留言
張貼留言