smtpClient
mv sendmail smtpClient
add Makefile for smtpClient
detail: http://code.google.com/p/mylibs/source/browse/#svn/trunk/tools/smtpClient
mv sendmail smtpClient
add Makefile for smtpClient
detail: http://code.google.com/p/mylibs/source/browse/#svn/trunk/tools/smtpClient
set dir=~/.vim/swp
set backup
set backupdir=~/.vim/backup/
set backupext=.bak
set autoindent "always set autoindenting on
set smartindent "set smart indent
set smarttab "use tabs at the start of a line, spaces elsewhere
set expandtab "not use tab
set tabstop=4 softtabstop=4 shiftwidth=4
set smartcase
set ignorecase " easier to ignore case for searching
set incsearch " do incremental searching
set hlsearch " highlighting the last used search pattern. or :noh
"set list " show chars on end of line, whitespace, etc
"set nowrap " do not wrap lines
set wildmenu " command-line completion operates in an enhanced mode
set history=50 " keep 50 lines of command line history
set mouse=a " set mouse functions
"don't make noise
set noerrorbells
set novisualbell
filetype on " detect the type of file
syntax on " syntax highlighting on
set fileformats=unix,dos
set textwidth=80
set ruler " show current positions along the bottom
set foldenable " turn on folding
set foldmethod=indent " make folding indent sensitive
set foldlevel=100 " don't autofold anything
set foldopen-=search " don't open folds when you search into them
set foldopen-=undo " don't open folds when you undo stuff
"set encoding=prc
"set fileencoding=prc
"set fileencodings=prc
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=utf-8
set guifont=Consolas\ 12
"set gfn=Consolas:h12 gfw=Consolas:h12
"auto change work dir
set autochdir
let Tlist_Ctags_Cmd = '/usr/bin/ctags'
map <F5> :VTreeExplore<CR>
map <F6> :TlistToggle<CR>
map <C-T> :tabnew<CR>
map <C-W> :tabclose<CR>
map <S-Left> :tabprev<CR>
map <S-Right> :tabnext<CR>
map <Left> :bp<CR>
map <Right> :bn<CR>
map <F4> :bd<CR>
map <C-Q> :bdelete<CR>
map <C-C> "+y<CR>
map <C-V> "+gP<CR>
"A collection of C extension Vim syntax. $HOME/.vim/after/syntax
let glib_enable_deprecated = 1
let glib_deprecated_errors = 1
au BufEnter * if &textwidth > 0 | exec 'match Todo /\%>' . &textwidth . 'v.\+/' | endif
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h set shiftwidth=4
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h set softtabstop=4
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h set tabstop=4
au BufRead,BufNewFile *.py,*.pyw set expandtab " not use tab
au BufRead,BufNewFile *.c,*.h set noexpandtab " use tab
au BufRead,BufNewFile Makefile* set noexpandtab
highlight BadWhitespace ctermbg=red guibg=red
au BufRead,BufNewFile *.py,*.pyw match BadWhitespace /^\t\+/
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h set textwidth=79
au BufNewFile *.py,*.pyw,*.c,*.h set fileformat=unix
autocmd bufnewfile *.py call setline(1,'#! /usr/bin/env python') |
\ call setline(2,'# -*- coding: utf-8 -*-') |
\ call setline(3,'') |
\ call setline(4, strftime("# Create Date: %F %T")) |
\ call setline(5,'# Author: N23 <No.0023@gmail.com>') |
\ call setline(6,'# Blog: http://n23.appspot.com/blog') |
\ call setline(7,'') |
\ call setline(8,'') |
\ exe "normal G"
"Python iMaps
au FileType python inoremap <buffer> $r return
au FileType python inoremap <buffer> $s self
au FileType python inoremap <buffer> $c ##<cr>#<space><cr>#<esc>kla
au FileType python inoremap <buffer> $f from
au FileType python inoremap <buffer> $i import
au FileType python inoremap <buffer> $p print
au FileType python inoremap <buffer> $d """<cr>"""<esc>O
"Java iMaps
autocmd FileType java inoremap <buffer> $pr private
autocmd FileType java inoremap <buffer> $r return
autocmd FileType java inoremap <buffer> $pu public
autocmd FileType java inoremap <buffer> $i import
autocmd FileType java inoremap <buffer> $b boolean
autocmd FileType java inoremap <buffer> $v void
autocmd FileType java inoremap <buffer> $s String
autocmd FileType java inoremap <buffer> $e Exception
augroup python_prog
au!
fun! Python_fold()
execute 'syntax clear pythonStatement'
execute 'syntax keyword pythonStatement break continue del'
execute 'syntax keyword pythonStatement except exec finally'
execute 'syntax keyword pythonStatement pass print raise'
execute 'syntax keyword pythonStatement return try'
execute 'syntax keyword pythonStatement global assert'
execute 'syntax keyword pythonStatement lambda yield'
execute 'syntax match pythonStatement /\<def\>/ nextgroup=pythonFunction skipwhite'
execute 'syntax match pythonStatement /\<class\>/ nextgroup=pythonFunction skipwhite'
execute 'syntax region pythonFold start="^\z(\s*\)\%(.*:\s*\%(#.*$\)\?\)" end="^\%(\n*\z1\s\)\@!" transparent fold'
execute 'syntax sync minlines=2000 maxlines=4000'
set autoindent
set foldmethod=syntax
" set foldopen=all foldclose=all
set foldtext=substitute(getline(v:foldstart),'\\t','\ \ \ \ ','g').'\ \ ('.(v:foldend-v:foldstart+1).'\ lines)'
set fillchars=vert:\|,fold:\
endfun
autocmd FileType python call Python_fold()
augroup END
"Make dir $HOME/.vim/after/syntax
"untar this file to $HOME/.vim/after/syntax
"If you don't have $HOME/.vim/after/syntax/c.vim,
"then copy c.vim.example to $HOME/.vim/after/syntax/c.vim
"see :h mysyntaxfile-add
"set csprg=/usr/local/bin/cscope
"set csto=1
"set nocsverb
"set cst
"cs add ~/.cscope/cscope.out
" ctrl + ]
" ctrl + t / ctrl + o
" cs find
" help cscope
"this script use to excute make in vim and open quickfix window
"map <C-M> :call Do_make()<CR><CR><CR>
"nmap B :call Do_make()<cr><cr><cr>
"nmap C :cclose<cr>
"function Do_make()
" let filename = bufname("%")
" let suffix_pos = stridx(filename, ".c")
" if suffix_pos == -1
" return
" else
" let target = strpart(filename,0,suffix_pos)
" endif
" let target = "make " . target
" execute target
" execute "copen"
"endfunction
"mkdir -p ~/.vim/templates
"let g:template_load = 1
"let g:template_tags_replacing = 1
"let g:T_AUTHOR = "N23"
"let g:T_AUTHOR_EMAIL = "No.0023@gmail.com"
"let g:T_AUTHOR_WEBSITE = "http://blog.chinaunix.net/u1/42287/"
"let g:T_DATE_FORMAT = "%F %T"
"change work folder
"cd ~/tmp
"runtime! ftplugin/man.vim
"use :Man
" vim *.c
" :argdo %s/oldvalue/newvalue/g
"
" %
" =%
" gg, G
" [[, ]]
" :reg
" "a5yy
" "ap
" "A5yy
" his c
" his s
" :1,5 co 10
" q
" :scriptnames
" :digraphs
" ga " hex
" :set noma " non modifiable
" :set ro " read only
" #session
" vim file1.c file2.c
" :mksession
" :q
" vim -S Session.vim
"
" map : all
" nmap: normal map
" vmap: visual map
" imap: insert map
"
" b:name " buffer
" w:name " window
" g:name " global
" v:name " vim
" a:name " function param
"
" :set all
" :list
" :augroup
/*
* Copyright 2008 N23 <No.0023@gmail.com>
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*
* Author:
* N23 <No.0023@gmail.com>
* Blog: http://n23.appspot.com/blog/
*
* compile: cc -Wall -W $(pkg-config --cflags --libs glib-2.0) -o $HOME/bin/run
*
* vi $HOME/.LoginAccount.txt
* [mail]
* host = smtp.qq.com
* port = 25
* user = ***
* pass = ***
* fr = No.0023@qq.com
* to = No.0023@gmail.com
*
*
* $Id: mail.c 51 2008-07-16 15:03:37Z No.0023 $
*/
#include <glib.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
static const char *config_filename = ".LoginAccount.txt";
static const char *config_label = "mail";
static const char *end_flag = "\r\n";
static const char *email_flag = "===== Baby, I love you. ^-^ =====";
const char *log_time();
int sendCmd(const int, const char*);
int fetchCmd(const int, const char *);
int conn(const char *, const int *);
int login(const int, const char *, const char *, const char *);
int sendmail_head (const int, const char *, const char *, const char *);
void sendmail_file(const int, const char *);
int sendmail_tail(const int);
const char *get_sub_string(const char *, const gsize, const gsize);
const void split_base64(const int, const char *, const gsize);
void sendmail_data(const int, const char *);
static void error_func(GOptionContext *context,
GOptionGroup *group,
gpointer data,
GError **error) {
if (*error && (*error)->message) {
gchar *progname = g_get_prgname();
g_print("%s: %s\nTry '%s --help' for more information.\n",
progname,
(*error)->message,
progname);
exit(1);
}
}
int
main (int argc, char *argv[])
{
GKeyFile *config;
gchar *path = g_build_filename(g_get_home_dir(), config_filename, NULL);
config = g_key_file_new();
g_key_file_load_from_file(config, path, 0, NULL);
gchar *host = g_key_file_get_string(config, config_label, "host", NULL);
gint port = g_key_file_get_integer(config, config_label, "port", NULL);
gchar *user = g_key_file_get_string(config, config_label, "user", NULL);
gchar *pass = g_key_file_get_string(config, config_label, "pass", NULL);
gchar *fr = g_key_file_get_string(config, config_label, "fr", NULL);
gchar *to = g_key_file_get_string(config, config_label, "to", NULL);
gchar *addr = NULL;
gboolean flag = FALSE;
GOptionEntry entries[] =
{
{"addr", 'e', 0, G_OPTION_ARG_FILENAME, &addr,
"mail address", "ADDR"},
{ "atta", 'a', 0, G_OPTION_ARG_NONE, &flag,
"attachment flag", NULL },
{NULL}
};
GOptionContext *context;
GError *error = NULL;
context = g_option_context_new("[args]");
g_option_context_add_main_entries(context, entries, NULL);
g_option_context_set_help_enabled(context, TRUE);
g_option_group_set_error_hook(g_option_context_get_main_group(context),
(GOptionErrorFunc)error_func);
g_option_context_parse(context, &argc, &argv, &error);
if (error) {
perror(error->message);
return error->code;
}
g_option_context_free(context);
if (argc == 1) g_error("No file to Send");
gint fd = conn(host, port);
if (addr) g_stpcpy(to, addr);
if ((login(fd, host, user, pass)) == -1) g_error("Login failed");
for (argv++; *argv != NULL; argv++) {
if (sendmail_head(fd, fr, to, *argv) == -1)
g_error("Sendmail header failed");
if (flag) sendmail_atta(fd, *argv);
else sendmail_file(fd, *argv);
if (sendmail_tail(fd) == -1)
g_error("Sendmail header failed");
}
close(fd);
return 0;
}
int
sendCmd(const int fd, const char* s)
{
int bytes;
g_printf("%s%s%s%s%s",
"Send: [",
log_time(),
"] ",
"CMD=",
s);
if ((bytes = send(fd, s, strlen(s), 0)) == -1) {
perror("send error");
return -1;
}
return bytes;
}
int
fetchCmd(const int fd, const char *cmd)
{
char buff[1024];
int bytes;
char *tmp;
if ((bytes = recv(fd, buff, 1024, 0)) == -1) {
perror("recv error");
return(-1);
}
buff[bytes] = '\0';
g_printf("%s%s%s%s%s",
"Recv: [",
log_time(),
"] ",
"Result=",
buff);
tmp = g_strndup(buff, 3);
if (strcmp(tmp, cmd) != 0)
return -1;
else
return 0;
}
const char *log_time()
{
char *ct;
time_t t;
t = time(NULL);
ct = ctime(&t);
*(strchr(ct, '\n')) = '\0';
return ct;
}
int
conn(const char *host, const int *port)
{
int sockfd;
struct sockaddr_in server_addr;
struct hostent *server_ip;
while ((server_ip = gethostbyname(host)) == NULL) {
herror("gethostbyname error");
sleep(30);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket error");
return -1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr = *((struct in_addr *) server_ip->h_addr);
bzero(&(server_addr.sin_zero), 8);
if (connect(sockfd, (struct sockaddr *)
& server_addr, sizeof(struct sockaddr)) == -1) {
perror("connect error");
return -1;
}
if (fetchCmd(sockfd, "220") == -1)
return -1;
return sockfd;
}
int
login(const int fd, const char *host, const char *user, const char *pass)
{
GString *s = g_string_new("");
g_string_append(s, "EHLO ");
g_string_append(s, host);
g_string_append(s, end_flag);
sendCmd(fd, s->str);
if (fetchCmd(fd, "250") == -1)
return -1;
g_string_erase(s, 0, -1);
g_string_append(s, "AUTH LOGIN");
g_string_append(s, end_flag);
sendCmd(fd, s->str);
if (fetchCmd(fd, "334") == -1)
return -1;
g_string_erase(s, 0, -1);
g_string_append(s, g_base64_encode(user, strlen(user)));
g_string_append(s, end_flag);
sendCmd(fd, s->str);
if (fetchCmd(fd, "334") == -1)
return -1;
g_string_erase(s, 0, -1);
g_string_append(s, g_base64_encode(pass, strlen(pass)));
g_string_append(s, end_flag);
sendCmd(fd, s->str);
if (fetchCmd(fd, "235") == -1)
return -1;
g_string_free(s, TRUE);
return 0;
}
int sendmail_head (const int fd,
const char *fr,
const char *to,
const char *subject)
{
GString *s = g_string_new("");
g_string_append(s, "MAIL FROM:");
g_string_append(s, "<");
g_string_append(s, fr);
g_string_append(s, ">");
g_string_append(s, end_flag);
sendCmd(fd, s->str);
if (fetchCmd(fd, "250") == -1)
return -1;
g_string_erase(s, 0, -1);
g_string_append(s, "RCPT TO:");
g_string_append(s, "<");
g_string_append(s, to);
g_string_append(s, ">");
g_string_append(s, end_flag);
sendCmd(fd, s->str);
if (fetchCmd(fd, "250") == -1)
return -1;
g_string_erase(s, 0, -1);
g_string_append(s, "DATA");
g_string_append(s, end_flag);
sendCmd(fd, s->str);
if (fetchCmd(fd, "354") == -1)
return -1;
g_string_erase(s, 0, -1);
g_string_append(s, "From:");
g_string_append(s, fr);
g_string_append(s, end_flag);
g_string_append(s, "To:");
g_string_append(s, to);
g_string_append(s, end_flag);
g_string_append(s, "Subject:");
g_string_append(s, subject);
g_string_append(s, end_flag);
g_string_append(s, "Mime-Version: 1.0");
g_string_append(s, end_flag);
sendCmd(fd, s->str);
g_string_erase(s, 0, -1);
g_string_append(s, "Content-Type: multipart/mixed;Boundary=\"");
g_string_append(s, email_flag);
g_string_append(s, "\"");
g_string_append(s, end_flag);
g_string_append(s, end_flag);
sendCmd(fd, s->str);
g_string_free(s, TRUE);
return 0;
}
void
sendmail_file(const int fd, const char *file)
{
GString *s = g_string_new("");
g_string_append(s, "--");
g_string_append(s, email_flag);
g_string_append(s, end_flag);
g_string_append(s, "Content-Type: text/plain; charset=\"utf-8\";");
g_string_append(s, end_flag);
g_string_append(s, "Content-Transfer-Encoding: base64");
g_string_append(s, end_flag);
g_string_append(s, end_flag);
sendCmd(fd, s->str);
g_string_free(s, TRUE);
sendmail_data(fd, file);
}
void
sendmail_atta(const int fd, const char *file)
{
GString *s = g_string_new("");
g_string_append(s, "--");
g_string_append(s, email_flag);
g_string_append(s, end_flag);
g_string_append(s, "Content-Type:application/octet-stream;name=\"");
g_string_append(s, file);
g_string_append(s, "\"");
g_string_append(s, end_flag);
g_string_append(s, "Content-Transfer-Encoding: base64");
g_string_append(s, end_flag);
g_string_append(s, "Content-Disposition:attachment;filename=\"");
g_string_append(s, file);
g_string_append(s, "\"");
g_string_append(s, end_flag);
g_string_append(s, end_flag);
sendCmd(fd, s->str);
g_string_free(s, TRUE);
sendmail_data(fd, file);
}
int sendmail_tail(const int fd)
{
GString *s = g_string_new("");
g_string_append(s, end_flag);
g_string_append(s, end_flag);
g_string_append(s, "--");
g_string_append(s, email_flag);
g_string_append(s, "--");
g_string_append(s, end_flag);
sendCmd(fd, s->str);
g_string_erase(s, 0, -1);
g_string_append(s, end_flag);
g_string_append(s, ".");
g_string_append(s, end_flag);
sendCmd(fd, s->str);
if (fetchCmd(fd, "250") == -1)
return -1;
g_string_free(s, TRUE);
return 0;
}
const char *
get_sub_string(const char *str, const gsize start, const gsize end)
{
gsize n = end - start;
static char stbuf[256];
if (start >= strlen(str)) {
return NULL;
} else {
strncpy(stbuf, str + start, n);
stbuf[n] = '\0';
return stbuf;
}
}
const void
split_base64(const int fd, const char *text, const gsize len)
{
gchar *code = g_base64_encode(text, len);
GString *s = g_string_new("");
gsize l = strlen(code);
guint start = 0, end = 0;
g_printf("split_base64 ...start\n");
int bytes;
for(end = 78; start < l; start +=78, end += 78) {
g_string_append(s, get_sub_string(code, start, end));
g_string_append(s, "\n");
if ((bytes = send(fd, s->str, s->len, 0)) == -1)
g_error("send error in split_base64");
g_string_erase(s, 0, -1);
}
g_printf("split_base64 ...done\n");
g_free(code);
g_string_free(s, TRUE);
}
void sendmail_data(const int fd, const char *file)
{
GString *s = g_string_new("");
g_string_append(s, end_flag);
g_string_append(s, end_flag);
sendCmd(fd, s->str);
gchar *text;
GError *err = NULL;
gsize len;
if (g_file_get_contents(file, &text, &len, &err))
split_base64(fd, text, len);
g_string_erase(s, 0, -1);
g_string_append(s, end_flag);
g_string_append(s, end_flag);
sendCmd(fd, s->str);
g_free(text);
g_string_free(s, TRUE);
}
Here is my public PGP key:
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.8 (OpenBSD)
mQGiBEiTdXsRBADbaQp99heFlinoOiJP8GZWcMIKXjelDZr9sWoTcfa7VL7CT2cf
8Dd0zMEVJ3y0H1/ipuvxu3P+vGo01vwNDK5Gja+5PHLMkxayn/3KVccUeX+rBRbn
51OuBr2WY+lPgJwOj7CqJ/S1QO0r5gRFWtq7TSvsOh1b0Fdttjnn2wbXGwCgr3n0
4mA4ocipyYuxlb9YwvncXAMD/RIRzwyHls2FEOdrL7Lrz3/WTRE5jk0PwryeIUrH
cdteiDuascqi16rvMNbcuOrUMP6LE4Rsn/XiXV+/cx6krYrieMYoQjgTDFyoxAc+
eQoNEhyNokLW9q3YQhUAW8E6q4OvlZfFxhYMEkPspm6Vp2zGExpnv6SBlWdwkcCQ
X4MoA/0WKKVtLhh0B9wfcmu7dbtAH9v+I4u3qlHreOuwStX5CJDfv9R5sSzhmVGs
F0sl31vvva9nXaNsKQHYIknxOvpHODWgsBFy5c3QvnXhYisx+tKrvn6rf/9Buy/7
NTBcpePH98IfqEItEh21zi6WMNl2Ne5u00QqoQR39Scw2pqj1rQvTjIzIENoYW4g
KEdudVBHIC0tIE9wZW5CU0QpIDxOby4wMDIzQGdtYWlsLmNvbT6IYAQTEQIAIAUC
SJN1ewIbAwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEBuNoxTHQdpxOd4AoJqZ
XLAIN+DGyKle4EbUZShy05GtAKCLOqAn8rn+ZLuSLmvZmeKQFbxYJLkCDQRIk3V7
EAgAuGI+XQZwzC2x09naIO0CHiwdMNmgLsgOK9yLGkxcuZyS8U39LKIlKDQeBx9s
LGbRm77Tju45cvIPKcErdTmmIpwztrhGwogqrEQeA8DQyu9KsabxOYNaoTK18XI2
2t3WwrJ2NxB7nLPHH5ORnaZLq+DDEl0BYshgOI1XQ1VX2LalBInAoGNcTIHr7uuv
zsuisaXObkUQ4dZchjkNWCUG0cs1XjnOuffoRk++i9MUSYBsiL4lXZ6vKGLUJKm1
Pms8TOi6iv3oKb7y1Jp/utM3O2+jMM9ThcZsYCIUYXJ0DcHBu1WWavDdbY9G+OCa
j0LB1dZ0Ki+MsBcjhdSRL01Y2wADBQgAn14YJfZJlzzsFHiBJalqpk/mokxpl13H
IRyoov+CpNm0bXJXoadusffh0EYM19ftg5uonngM4nzni9Er8Zm1FC0lVU7+9UXs
epbZgz+tBHvl6fNrBbCL+QdX9laysyYvPbKgujcxwpyzhMVeVfqfLZptQ9MxYKyO
v1LvtGYWL3MmTdVf+XE7MNo+qbVF29y5sMhEG87EJRw253aFDPCPmGHyTkwgAz/n
Uf7/3vjkYu5fxXT6qaCUR+pUOQ6iHsbvHu2LRzwauiGf2TjXGdmPazZJHvKgbn8d
gMd0sT6ckJ1puyHopBttdwk7nlpEz5mMITUnmv2B1PCt5SbL2HBbQohJBBgRAgAJ
BQJIk3V7AhsMAAoJEBuNoxTHQdpxhXwAoJX2uYi+Ui7udN8BZbyg/q8rrmXfAJ9G
43s7DxS2guqPsADHkYeEzxrDLg==
=TvaW
-----END PGP PUBLIC KEY BLOCK-----
you can get it from server also, as:
$ gpg --keyserver pgp.mit.edu --recv-keys C741DA71
w3mman:
Shell:/var/db/pkg >: pkg_info -L w3m-0.5.1p2-image
Information for w3m-0.5.1p2-image
Files:
/usr/local/bin/w3m
/usr/local/bin/w3mman
/usr/local/libexec/w3m/cgi-bin/dirlist.cgi
/usr/local/libexec/w3m/cgi-bin/multipart.cgi
/usr/local/libexec/w3m/cgi-bin/w3mbookmark
/usr/local/libexec/w3m/cgi-bin/w3mhelp.cgi
/usr/local/libexec/w3m/cgi-bin/w3mhelperpanel
/usr/local/libexec/w3m/cgi-bin/w3mmail.cgi
/usr/local/libexec/w3m/cgi-bin/w3mman2html.cgi
/usr/local/libexec/w3m/inflate
/usr/local/man/man1/w3m.1
....
如果你有一个ssh shell,比如: 192.168.1.23
于是你随时拥有了一个socks5代理了: ssh -2CNf -D 3121 192.168.1.23
端口为3121, 可以用来上QQ,MSN等等,如果你非要一个http代理,那就安装一个软件叫: privoxy
写它的配置文件:
vi /etc/privoxy/config:
listen-address 127.0.0.1:3128
permit-access 127.0.0.1
forward-socks4 / 127.0.0.1:3121 . # 注意有个句号哦。
端口为3128。
如果你的ssh shell在国外的话,你可以穿过那伟大的GFW。