Posts Tagged bash
Remove DOS carriage return
After writing a shell script on Windows and trying to execute it on Linux, I got the following error message:
/bin/sh^M: bad interpreter: No such file or directory
The problem is obviously because the return line character on Windows and Linux are different. But how to fix it in order to execute it on Linux?
I firstly tried to open it, copy the content of the file and paste it in a new file using only Linux command line, but it didn’t work. ๐
However, I found the following thread which fixed the problem:
http://www.reachdba.com/showthread.php?335-bin-sh-M-bad-interpreter-No-such-file-or-directory-apps11i-Instalation
Here is what you need to do:
- Open your file using vi
- Write the command
:set fileformat=unix
- Save the file using
:wq
The file should now run on Linux. ๐
CP2102 on DNS-323
In one of my personal projects, I needed to connect and use a USB to RS232 (Serial) converter on my D-Link DNS-323. Weird requirements, I know. Anyway… ๐
Plenty of these converters exist out there, but I choose to go for a CP2102:
Innocently, I first tried to compile the code source of this module which can be found on the following page:
http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx
After a few painful and unsuccessful tries, I decided to look around for the already-compiled module. ๐
While wondering why I didn’t think of that before, I used the instructions below to install the required modules on my NAS:
cd /mnt/HD_a2/ffp/lib/ mkdir modules mkdir modules/2.6.12.6-arm1 cd modules/2.6.12.6-arm1 wget http://dev.skcserver.de/dns323/modules_v1.03/kernel/drivers/usb/serial/usbserial.ko wget http://dev.skcserver.de/dns323/modules_v1.03/kernel/drivers/usb/serial/cp2101.ko chmod 755 usbserial.ko chmod 755 cp2101.ko
Once the modules are installed, the next step is to initialize them.
I wrote the following script for this purpose so you can execute it anytime you need it:
#!/bin/sh insmod /ffp/lib/modules/2.6.12.6-arm1/usbserial.ko insmod /ffp/lib/modules/2.6.12.6-arm1/cp2101.ko mknod /dev/ttyUSB0 c 188 0 chmod 0666 /dev/ttyUSB0
At this point in time, you should have your module initialized on your D-Link DNS-323.
You can check the kernel ring buffer using the dmesg command to verify it loaded properly.
This is a snapshot of what I have in my kernel ring buffer after I ran the script above:
usbcore: registered new driver usbserial drivers/usb/serial/usb-serial.c: USB Serial support registered for Generic usbcore: registered new driver usbserial_generic drivers/usb/serial/usb-serial.c: USB Serial Driver core v2.0 drivers/usb/serial/usb-serial.c: USB Serial support registered for CP2101 CP2101 1-1:1.0: CP2101 converter detected usb 1-1: reset full speed USB device using ehci_platform and address 5 usb 1-1: CP2101 converter now attached to ttyUSB0 usbcore: registered new driver CP2101 drivers/usb/serial/cp2101.c: Silicon Labs CP2101/CP2102 RS232 serial adaptor driver v0.04
Finally, you can test the communication with your USB to RS232 converter by connecting a LED between the RXD and 3V outputs and running the following script:
#!/bin/sh while [ true ] do echo "hello world!!!" > /dev/ttyUSB0 echo "sent" sleep 1 done
If you see the LED blinking, it means you succeed! ๐
Redirect traffic to a specific network
This is a little trick which can be useful in some very specific case.
For example, you could have a machine with two network cards. One of the network is behind a proxy and the other one is connected directly to the internet.
You might want to forward all the traffic for google.com to the network which doesn’t have a proxy.
To do this, I am using the command route:
route add <hostname> <target network>
For example:
route add google.com 192.168.101.1
Note that this command is available on both Linux and Mac.
Install s3fs on Amazon Clouds
s3fs is a FUSE filesystem that allows you to mount an Amazon S3 bucket as a local filesystem. It stores files natively and transparently in S3 (i.e., you can use other programs to access the same files).
The following instructions detail the steps to install the program s3fs on an Amazon EC2 running Debian 5.0.5.
- Install libfuse
First, you need to install the package libfuse manually as the one provided via apt-get is too old (s3fs needs a version greater than or equal to 2.8.4).wget http://downloads.sourceforge.net/project/fuse/fuse-2.X/2.8.7/fuse-2.8.7.tar.gz tar xzf fuse-2.8.7.tar.gz cd fuse-2.8.7 ./configure --prefix=/usr make install
- Install libxml
You can simply install the package provided by apt-get:apt-get install libxml2-dev
- Upgrade mount
Because of a problem between fuse and mount, you need to upgrade the version of mount:wget http://www.kernel.org/pub/linux/utils/util-linux/v2.21/util-linux-2.21-rc1.tar.gz tar xzf util-linux-2.21-rc1.tar.gz ./configure --prefix=/usr --without-ncurses make install
For more information about this issue, please go to the following page: http://code.google.com/p/s3fs/issues/detail?id=228
- Install s3fs
You can now install s3fs using the following commands:wget http://s3fs.googlecode.com/files/s3fs-1.61.tar.gz tar xvzf s3fs-1.61.tar.gz cd s3fs-1.61/ ./configure --prefix=/usr make install
Note that I wanted to use s3fs to create incremental snapshot-style backups with rsync. Unfortunately, as mentioned on the following page, it didn’t work because s3fs doesn’t support hard links: http://code.google.com/p/s3fs/issues/detail?id=46
S3 command failed if the time is not synced
This is already the second post about the s3sync ruby program. The first article was focused on monitoring s3sync with Zabbix.
I will talk on this one about an error I got when running the S3 synchronisation:
S3 command failed: list_bucket prefix /data max-keys 200 delimiter / With result 403 Forbidden S3 ERROR: # s3sync.rb:290:in `+': can't convert nil into Array (TypeError) from s3sync.rb:290:in `s3TreeRecurse' from s3sync.rb:346:in `main' from ./thread_generator.rb:79:in `call' from ./thread_generator.rb:79:in `initialize' from ./thread_generator.rb:76:in `new' from ./thread_generator.rb:76:in `initialize' from s3sync.rb:267:in `new' from s3sync.rb:267:in `main' from s3sync.rb:735
As you can see, this error is not very human-friendly! ๐ฎ The only thing we know is that the S3 command failed because of the error can't convert nil into Array
. It looks to me like an internal error within s3sync…
But after some investigation, it appears it is simply because the system date on the server is not correct. I cannot tell you how much time I spent on this one!ย ๐ฏ
Anyway, if you are doing automatic backups as describe on John Eberly’s blog, you need to add the following code at the top of your upload.sh
script:
# update the system date /usr/sbin/ntpdate 3.uk.pool.ntp.org 2.uk.pool.ntp.org 1.uk.pool.ntp.org 0.uk.pool.ntp.org
NB: please find below the command lines I use to install ntpdate on a Debian server:
apt-get install ntpdate dpkg-reconfigure tzdata