ShellShock is a Bash vulnerability, which allows bypassing environment restrictions in certain environments. See Ubuntu Security Notice USN-2363-1. And for more detailed description, see CVE-2014-7169.
This Bash bug can be potentially bigger than the Heartbleed bug, because Bash shell is usually the default shell for the user, and many commands will also spawn Bash to execute. See this answer http://askubuntu.com/a/528102 from StackOverflow.
Running the following command will determine if the system is vulnerable or not:
1
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Luckily, this is relatively easy to patch. Simple apt-get update && apt-get upgrade will patch the Bash with the latest security fix. For example, this is a patched Bash version:
1
2
$ bash --version
GNU bash, version4.2.25(1)-release
This is for Ubuntu 12.04 LTS. If you are running Ubuntu 14.04 LTS, you have to upgrade to Bash 4.3-7ubuntu1.3.
Bash supports extended pattern matching. By using the built-in utility we can check if it is enabled or not:
$ shopt extglob
If not, to enable it:
$ shopt-s extglob
By default extglob is on in interactive shells, but off in non-interactive shells.
The key about extended pattern matching is pattern list via | (what we usually see as a OR operator). But do not think about it as that, think about it as a list of array pattern that are separated by | instead of ,. And actually one of them is the same as {} or brace expansion, but it can do more than expanding.
Here are the pattern operators:
? * + @ !
Create some example files:
$ touch a{,1,2,11,12}.js && ls
a11.js a12.js a1.js a2.js a.js
?(pattern-list)
Zero or one (any one) occurrence of the giving pattern:
$ ls a?(2|1).js
a1.js a2.js a.js
*(pattern-list)
Zero or more occurrences of the giving pattern (essentially everything):
$ ls a*(2|1).js
a11.js a12.js a1.js a2.js a.js
+(pattern-list)
One or more of the giving pattern (notice a.js is missing):
$ lsa+(2|1).js
a11.js a12.js a1.js a2.js
@(pattern-list)
Any one of giving pattern:
$ ls a@(2|1).js
a1.js a2.js
!(pattern-list)
None of the giving pattern:
$ ls a!(2|1).js
a11.js a12.js a.js
One mistake I had was getting confused between extended pattern matching and brace expansion, for example:
$ ls test/@{src|spec}/*.js
ls: cannot access test/@src/*.js:No such file or directory
ls: cannot access test/@spec/*.js:No such file or directory
Extended pattern uses parentheses () not braces {} as in brace expansion.
Also, these two patterns are the same:
test/@(src|spec)/*.js
test/{src,spec}/*.js
In some situations, extended pattern matching does not work, for example, matching files from the current directory and from one of the subdirectories with the following directory structure:
1
2
3
4
5
6
7
8
9
$ tree
.
├── app.js
├── lib
│ └── util.js
└── test
└── main.js
2directories, 3files
I would like to match js files from the current directory and lib/ directory, sort of like:
$ ls *.js lib/*.js
app.js lib/util.js
But this does not do it:
$ ls@(.|lib)/*.js
Instead, use brace expansion:
$ ls {.,lib}/*.js
Finally, Node’s Minimatch supports brace expansion, extended globbing and globstar.
Node Version Manager is a simple bash script to manage multiple active Node versions. Why do you want to use it? If you like me, you want to try out the latest unstable version of the Node, but you still need to use the older and stable versions to develop and maintain your projects, then you should use NVM.
You can find out more information on NVM GitHub page, below are just my take on installing and using it.
Install
You can install NVM via the install script, but always do it the hard way by installing it manually:
The installed Node version will reside in ~/.nvm/v0.10.28.
List installed versions:
$ nvm ls
.nvm
v0.10.28
Use a specific Node version:
$ which node
/usr/local/bin/node
$ node -v
v0.11.13$ nvm use0.10.28Now using node v0.10.28$ node -v
v0.10.28$ which node
/home/chao/.nvm/v0.10.28/bin/node
Basically, NVM modified the search path.
$ echo$PATH
/home/chao/.nvm/v0.10.28/bin
To roll back:
$ nvm deactivate
/home/chao/.nvm/*/bin removed from $PATH
/home/chao/.nvm/*/share/man removed from $MANPATH
/home/chao/.nvm/*/lib/node_modules removed from $NODE_PATH
List Node versions available to install:
$ nvm ls-remote
Use .nvmrc file:
$ echo '0.10.28' >> .nvmrc$ nvm use
Found'/home/chao/.nvmrc' with version <0.10.28>
Now using node v0.10.28$ node -v
v0.10.28