[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}"



留言

這個網誌中的熱門文章

[Antergos] disable touchpad

[Editor] 入坑 Atom => Markdown 轉 PDF