标签归档:Linux

一种自由和开放源码的类Unix操作系统

为ArchLinux增加/etc/rc.local启动脚本

因为打算手动写Pi的IP地址,于是很自然的打算vi /etc/rc.local,结果左下角出现了“新文件”的提示,然后我就纠结了,别这样,连自启动的脚本都没有了……我还怎么玩?

经过一番Google,在Ubuntu的论坛上发现了一个指导(为毛Arch的问题跑到Ubuntu的论坛去了):

http://forum.ubuntu.org.cn/viewtopic.php?f=155&t=395231

3楼说明了解决的办法:

修改/etc/systemd/system/rc-local.service

[Unit]
Description=/etc/rc.local Compatibility

[Service]
Type=oneshot
ExecStart=/etc/rc.local
TimeoutSec=0
StandardInput=tty
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

如果是简单的自定义命令,可写入/etc/rc.local,用上面的方法来处理。然后使用

systemctl enable rc-local.service

来启用这个脚本的服务。

不得不说ArchLinux这种管理方式也是相当的出色,但是因为刚接触,导致命令相当的不熟悉,让我控制的非常不舒服……

给派换了个ArchLinux

因为Debian系的Linux玩的有点多,于是想找另外一个发行版来玩一下。 先是装了个pidora,可是出了点问题,一启动就报错

drivers/rtc/hctosys.c: unable to open rtc device (rtc0)

在Google上搜索,但是结果只有两页,而且看了一些,也没有什么参考价值……好吧~我再换一个! 再继续在wiki上看有哪些系统可以玩……哎~ArchLinux,早听说过这个了,听说是超轻量级而且出色的Linux,好,就决定是你了! 先从Google找到ArchLinux的RaspberryPi版,下回来,大小不到200M,是目前找到的镜像里面最小的,解压出来,依旧有1.9G,这压缩率真恐怖。 然后就是将系统烧录到SD卡上。Windows的话就用Win32DiskImager,Linux或者MAC或者Unix系的话就dd,用法是

dd if=镜像 of=SD卡的设备名称

SD卡的设备名称一般为mmcblk,mmcblk0是第一张SD卡,mmcblk0p1是第一张SD卡的第一个分区,详情看自己的/dev。更多详情请自行Google。

写好之后最好还是找个Linux环境(用Windows又不想装Linux的给我弄个虚拟机去),以方便对SD的扩展操作。

因为没有显示器在手边,按照老方法,用TTL来登陆操作,下面是来自http://lavalink.com/2012/03/raspberry-pi-serial-interfacing/的示意图。 raspberry-pi-serial_sm 照着连接好之后,用终端工具连接,我这里用的是putty,简单快捷。

给RaspberryPi上电之后大概几秒钟(ArchLinux启动就是这么快!),系统就启动完成了。而且在TTL口没有调试信息的输出,当初还以为出了什么问题,结果点了几下回车,就出现了登陆提示……

最先要做的事情当然是修改locale,参考https://wiki.archlinux.org/index.php/Beginners’Guide(简体中文)

修改/etc/locale.gen,去掉想要的locale前面的注释,然后运行一次locale-gen。想要的locale就出来了。

下一步是改环境变量,

export LANG="zh_CN.UTF-8"

然后可以修改~/.config/locale.conf,加入自己想要的locale,以后登陆就不用每次都手动改变量了。

语言弄好了,接着就是扩展一下SD卡上的分区。因为镜像是根据2G的SD卡搞的,这意味着我手上的8G的SD卡有6G没有用到。

先找个Linux环境,因为磁盘操作的话不能在Pi自身上完成,就算是OpenWrt来做也可。

参考:http://conanblog.me/blog/raspberry-pi/hack/arch/linux/go/2013/02/17/play-with-raspberry-pi/

fdisk -uc /dev/mmcblk0

打开SD进行操作。

用p来列出分区表,用d来删除分区,用n来新建分区。

附上原文中的操作过程作为参考:

$ sudo fdisk -uc /dev/mmcblk0

# 打印分區表
Command (m for help): p

Disk /dev/mmcblk0: 3904 MB, 3904897024 bytes
64 heads, 32 sectors/track, 3724 cylinders, total 7626752 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0004f23a

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1   *        2048      186367       92160    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          186368     3667967     1740800   83  Linux

# 刪除第二個分區
Command (m for help): d
Partition number (1-4): 2

# 新建一個分區
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2

# !!! 第一個扇區號必須和上面刪除的分區的起始扇區號一樣,這裏的話是186368 !!!
First sector (186368-7626751, default 186368): 186368
Last sector, +sectors or +size{K,M,G} (186368-7626751, default 7626751):
Using default value 7626751

# 保存剛剛的操作並退出
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

然后检查磁盘错误、扩容

$ sudo e2fsck -f /dev/mmcblk0p2
$ sudo resize2fs -p /dev/mmcblk0p2

然后就基本上能用了。

在OpenWrt的WiFi上使用非英文字符作为SSID和密码

最近又给同学刷了一只路由,在设置wifi的时候突然来了兴致,不如用中文来做SSID吧~然后就干了,在luci上使用中文写了SSID,然后应用之后,发现luci的页面上能够正确的显示中文,但还到了windows上就变成了一串英文,然后用手机一搜,哟~中文哎。

显然是字符编码的问题了。

总所周知,windows使用的是GB的字符编码,而Linux一般使用的是UTF-8,除非你手动改成了GB。用Linux做底层的Android果然跟随了Linux的步伐,编码使用了UTF-8,而Openwrt的Luci也用的是UTF-8的编码,如此一来,便解释得通了。

用notepad++打开/etc/config/wireless,编码切换到GB,将SSID改成了中文,保存,然后重启WiFi,然后一搜:

中文SSID

果了个然,于是中文的SSID就出来了,别人看到都觉得很惊奇。这时候就可以给你的WiFi一个有趣的SSID,比如之前看到的“网络无法连接”,估计可以让相当一部分的人放弃连接你家WiFi的念头。

另外一件很有趣的事情就是,虽然使用了GB编码的SSID,但是Ubuntu却表示我能够正确的认出中文的SSID,并显示出来。UTF-8编码的中文SSID,Ubuntu同样能够正确地显示中文,这实在太不可思议了。

===========================接下来就是把密码给玩坏===============================

最初的时候,就尝试直接使用GB的编码来写中文密码。ok,windows说他能连上。但是Linux表示我们 UTF-8的编码没法通过密码验证。

问题就来了,怎么办呢?

把密码换成UTF-8如何?

然后Ubuntu就表示,嗯,我们没问题!

中文WiFi密码

啧……这可难办了,难道就没有两者都能兼容的办法么?

然后在来回切换编码的时候,我发现了一个问题,UTF-8转成GB之后是乱码,但是看起来却都是正确的中文字符……要不旧直接用这个乱码来试试连接吧……Windows说:没问题!然后就连上了。

GB编码下的SSID和密码

GB编码下的SSID和密码

UTF-8编码下的SSID和密码

UTF-8编码下的SSID和密码

乱码密码

乱码密码

看来连接是没有问题呢~

也就是说使用GB编码的SSID和UTF-8编码的中文密码是最优的组合~无论linux和windows都可以连接到。

最后就是客人的问题……

移动设备的话估计没什么问题,但是捧着运行着Windows的电脑过来的孩子……有的麻烦了呢……

==============================追加移动设备的研究================================

很可惜的是,android和IOS都可以认出UTF-8编码的SSID,但是无法认出GB编码的SSID,只能看到一串乱码,这个实在是太糟糕了。微软你赶紧投奔UTF-8的怀抱吧。

与此同时,测试了UTF-8编码的密码,Android和IOS都能够使用中文密码来连接,但是IOS在输入密码的时候,只能输入英文字符,所以,需要使用复制粘贴的方法,来完成密码的填写。Android的话,可以强制切换键盘来输入中文。

另外的就是,即使使用中文字符,也必遵循WPA2密码最少8个字符的原则,所以最短密码是八个中文字,而不是4个中文字。

等我以后能装OSX的之后再补上MAC的研究报告。

脚本错误:Syntax error: end of file unexpected

继续上参考:http://bbs.chinaunix.net/thread-1081627-1-1.html

嘛……因为是初学者的原因,犯了个非常低级的错误呢……

根据提示,知道了问题所在了,是结构没有完成,因为是用了嵌套的case结构,所以,漏掉了一个esac,也漏掉了一个;;

case 变量名 in
值1)
case 变量名 in
值11)
指令
;;
值12)
指令
;;
esac
;;
值2)
case 变量名 in
值21)
指令
;;
值22)
指令
;;
esac
;;
esac

-bash: ./script.sh: /bin/sh^M: 坏的解释器: 没有那个文件或目录

参考:http://blog.csdn.net/wdt3385/article/details/8015730

最近在做毕设,要用到shell script,于是开始编写,嘛,由于图形界面着实方便外加我是个懒人这个因素,所以编写平台是Windows & Samba & Notepad++,所以才弄出这么个混事来……

 今天在翻看以前写的简单的shell脚本时,发现一个问题: 

    当./运行时总是提示:  (bash: ./hello.sh: bin/bash: 坏的解释器: 没有那个文件或目录),但是当用sh运行时正确.

    原来的脚本:

    (试试看你能否一眼看出错误)

    #!bin/bash

    echo "Hello Linux!"

    后来几番检查发现自己写的丢了一些东西.

    应该把红体字改成  #!/bin/bash    (!后面少了/)

    唉,很简单的问题,自己以前没有发现还有这样的错误! shell脚本的确好用,可唯一难的就是格式要求太高!

-----------------------------------------------------------------------------------------------------------------------------------------------------------

另外出现此问题的原因还有:

/bin/sh^M:损坏的解释器: 没有那个文件或目

 今天在Windows环境下用UE写了个shell脚本,然后拿到linux下运行发现如下错误:

/bin/sh^M:损坏的解释器: 没有那个文件或目录

 出现这个问题的原因如下:在Windows下,每一行的结尾是\n\r,但是在Linux下文件的结尾是\n。因此在Windows环境下编辑过的文件在Linux下打开看的时候每一行的结尾就会多出来一个字符\r。

 因此,想要在Windows环境下编辑的脚本应该保存为UNIX而不是DOS格式,很多文本编辑器都支持另存为Unix格式的功能。

 如果脚本文件保存时使用了DOS格式,我们就可以通过以下几种方法来将它转换为UNIX格式:
 用vim打开该脚本,在命令行模式下输入:setff=unix来转换.
 使用命令:sed-i ‘s/\r$//’ urfile.
 使用UE打开该脚本,然后另存为UNIX换行符的脚本.

中的第二部分,我一看,果然编码是windows的,切换过去Unix就没问题了。

真不该在windows平台上做linux的开发……

在搭建vpn的时候都是需要写iptables的

嗯,刚把openvpn给弄了出来,本来打算直接连上vps,然后写上路由表,结果没想到意外的麻烦,因为iptables的转发没有写好,结果只能ping到服务器,转发都转不出去,最后前思后想,觉得是这个iptables的问题,稍微翻一下以前的资料,找到了相关的内容。

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.9.0/24 -j MASQUERADE

像上面一样的命令,只要是搭建了vpn的话,就必须写这个(似乎openwrt不用,只要直接把新建的tun/tap接口加到lan里面,openwrt的firewall就会自动处理转发,真不愧是专门的路由系统啊),不然的话会不处理转发。

如果iptables里面的FORWARD默认处理时DROP或者REJECT的话,还要加上额外的允许

iptables -A FORWARD -s 192.168.9.0/24 -j ACCEPT

之前的真是折腾啊

[笔记]Linux强制注销其他在线用户

原文地址:Linux强制注销其他在线用户

先用w查看在线用户。

goface ~ # w

11:53:14 up 53 min, 3 users, load average: 0.00, 0.01, 0.05

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

root pts/0 192.168.1.8 11:11 0.00s 0.51s 0.02s w

goface tty7 :0 11:11 53:25 42.50s 0.23s gnome-session –session=classic-gnome

root pts/1 192.168.1.8 11:38 14:53 0.37s 0.37s -bash

那么如何把别人踢过去呢,呵呵。

#pkill -kill -t tty

#pkill -kill -t pts/1

再w一下,发现另一个连接终端被踢了,呵呵。

另外也可以使用skill命令。如

#skill -KILL -t pts/1 能达到同样的效果。

#skill -STOP -u user1

#skill -KILL -u user1 杀死并注销user1。

当然ps grep找出进程杀死也可以实现,不过没有使用上面的命令方便。大家有什么更好的方法,欢迎在回复中评论,大家一起分享,哈哈。

不知为何……之前我在自己的VPS上不能kill掉另外一个bash进程,最后是用了

skill -KILL -t pts/1

才成功了……

 

su: /bin/sh: Permission denied

嗯,出现这个问题好几次了,于是就稍微记录一下。

参考:http://sunrenen.iteye.com/blog/796187

 

出现这个问题的原因是切换过去的那个账户无法访问某些文件,包括

/
/bin/sh
/lib/ld-***.so

这堆文件都能被访问,问题就没问题了~

chmod 755 /bin /sbin /lib

一直以来藐视Samba是我的错

不知为何,一直以来都不怎么喜欢Samba的文件管理方式,直到昨天,多手把luci-app都装了一遍,其中有个Samba,就用上了。

在Windows上访问了一次之后,我擦嘞,居然可以直接打开!不用缓存!直接看在U盘上的视频完全不是问题啊。下载到电脑之后再看什么的弱爆了!

于是果断把移动硬盘换上去,啧,直接看自动硬盘上的300G资源啊,爽!

不过由于自动硬盘的格式是ntfs,用ntfs-3g挂载之后访问是没什么问题,不过太吃CPU了啊,而且似乎挂500G的移动硬盘还是有点吃力,看视频会卡,不知是无线的问题还是CPU的问题,以后再研究。

原来自己无知的东西还有很多啊。

重装了VPS,将Apache换成了Lighttpd

好吧,总感觉我将这个VPS折腾的不成样子了,根据不完全统计,买来这一个月已经被我重装系统超过10次(- -b),虽然很大部分是客服的原因(有些系统装上之后跑不动啊),不过不得不承认我太喜欢折腾着东西了……(或许是因为重装挺方便?)

这次重装是因为这个Apache太吃内存了,Gnome也太吃内存了,平常溜进去看看的时候,内存占用都在480M左右,SWAP也要吃掉100~200M,感觉太费劲了,就琢磨了,哎,换成Lighttpd吧,反正也就挂一个Blog,没多少东西,顺便也把Gnome给换掉吧,反正只要有桌面环境就可以了(方便使用DropBox,synaptic等),于是又装回Ubuntu(我装过那串50+的系统列表里面的大概20个,只有3,4个能用,其他都不能启动),顺便找到一个非常简单的桌面环境,叫做Fluxbox(真的很简陋!),把lighttpd,php,mysqlserver等装上之后,顺利的跑起来,内存的话大概占用了350+M,SWAP吃掉10几M,感觉心里暗爽了很多。

不过再重新安装Blog的时候完全的把我吓一跳啊,直接用命令mysqldump来把之前备份的数据库导入的时候,居然没有读出来,还是一个新新的wordpress,把我吓出一身冷汗,结果后来再在phpMyAdmin里面导入之后,数据又回来了,真是险过剃头一百倍。

而且换成Lighttpd之后,rewrite不能正常工作,还要做点手脚,结果是相当的折腾人的说。

不过首次感受到了Dropbox的方便啊,后台静默备份,还原也相当方便,真好啊。