npi-config 是我们这个 NanoPi-NEO 系统下的一个命令行的系统配置工具,利用它可以对系统进行一些初始化的配置,可配置的项目包括:用户密码、系统语言、时区、Hostname、SSH 开关、自动登录选项等。在命令行执行以下命令即可进入:
sudo npi-config
npi-config 的显示界面如下所示:
npi-config 工具的当前版本一共有8个菜单,分别是:
- Change User Password:修改缺省用户的登录密码
- Hostname:设置主机名,默认为 NanoPi-NEO
- Boot Options:配置一些启动选项,例如系统启动后登录 console 的默认用户
- Localisation Options:配置一些本地选项,例如语言、时区、键盘布局、Wi-Fi 频段等
- Interfacing Options:接口选项配置,例如开启或关闭 SSH 服务
- Advanced Options:高级配置,包括 Audio、欢迎信息等
- Update:升级 npi-config 到最新版本
- About npi-config:关于 npi-config 的信息
npi-config 的使用很简单,根据提示进行操作即可,一般不会有太大问题,这里就不详细讲解了,大家摸索几遍就可以了。
我在选择“Update”的时候看到如下提示:
Cloning into 'npi-config'...
remote: Counting objects: 5, done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 5
Unpacking objects: 100% (5/5), done.
Checking connectivity... done.
Sleeping 5 seconds before reloading npi-config
于是,猜测 npi-config 工具的更新操作就是拉取 git 仓库的最新代码,果然在 GitHub 上找到相关仓库,然后尝试用如下命令克隆npi-config源代码:
git clone https://github.com/friendlyarm/npi-config.git
克隆成功,可以看到 npi-config 目录下有三个文件:
npi-config README.md sample_profile_d.sh
其中 npi-config 就是我们上面所运行的系统配置工具,实际上,它是一个 Shell 脚本文件。这里抽取一部分代码:
#!/bin/sh
# Part of npi-config http://github.com/friendlyarm/npi-config
#
# See LICENSE file for copyright and license details
INTERACTIVE=True
ASK_TO_REBOOT=0
if [ -f /etc/friendlyelec-release ]; then
# get friendlyelec's boardt model
# example:
# BOARD="NanoPC-T2"
# LINUXFAMILY=nanopi2
. /etc/friendlyelec-release
fi
......
do_update() {
cd /tmp/
rm -rf npi-config
git clone https://github.com/friendlyarm/npi-config
if [ $? -eq 0 ]; then
SELFPATH=`which npi-config`
cp -f npi-config/npi-config $SELFPATH
chmod 755 $SELFPATH
rm -fr npi-config
printf "Sleeping 5 seconds before reloading npi-config\n" &&
sleep 5 &&
exec $SELFPATH
else
whiptail --msgbox "There was an error checking new version." 20 60 1
fi
}
#
# Interactive use loop
#
calc_wt_size
while true; do
FUN=$(whiptail --title "NanoPi Software Configuration Tool (npi-config)" --menu "Setup Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Finish --ok-button Select \
"1 Change User Password" "Change password for the default user (pi)" \
"2 Hostname" "Set the visible name for this Pi on a network" \
"3 Boot Options" "Configure options for start-up" \
"4 Localisation Options" "Set up language and regional settings to match your location" \
"5 Interfacing Options" "Configure connections to peripherals" \
"6 Advanced Options" "Configure advanced settings" \
"7 Update" "Update this tool to the latest version" \
"8 About npi-config" "Information about this configuration tool" \
3>&1 1>&2 2>&3)
RET=$?
if [ $RET -eq 1 ]; then
do_finish
elif [ $RET -eq 0 ]; then
case "$FUN" in
1\ *) do_change_pass ;;
2\ *) do_change_hostname ;;
3\ *) do_boot_behaviour ;;
4\ *) do_internationalisation_menu ;;
5\ *) do_interface_menu ;;
6\ *) do_advanced_menu ;;
7\ *) do_update ;;
8\ *) do_about ;;
*) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
else
exit 1
fi
done
看到 do_update 没?显然刚刚的猜想是正确的!好了,对 npi-config 的实现感兴趣的朋友接下来就可以分析该脚本了。在终端上看实在太不方便了,我决定把它拿出来用 Notepad++ 来看,那怎么拿呢?
打开 SecureCRT,用 SSH 登录 NanoPi-NEO(如果不懂请看上一节)。登录成功后按下 ALT+P 就开启新的会话进行 ftp 操作。估计是使用本地用户模式登录 ftp 服务器的,而我是用 root 登录 ssh 的,所以当前目录为root的家目录。好了,登录ftp后就可以使用get来下载文件了,操作如下:
sftp> ls
mjpg-streamer Music npi-config test.pcm
sftp> pwd
/root
sftp> get npi-config/npi-config
Downloading npi-config from /root/npi-config/npi-config
100% 19KB 19KB/s 00:00:00
/root/npi-config/npi-config: 20247 bytes transferred in 0 seconds (19 KB/s)
如果下载成功后不知道文件被存放到哪,可以在 SecureCRT 上选择“Options”–>“Session Options”–>“SFTP Session”,查看“Local directory”就知道下载的文件所存放的地方了。接下来就可以用 Notepad++ 好好分析 npi-config 啦!
关于 ftp 的命令,可以输入 help 查看该 FTP 提供所有的命令,这里列出一些常用的命令:
- pwd: 查询Linux主机所在目录(也就是远程主机目录)
- lpwd: 查询本地目录(一般指Windows上传文件的目录)
- ls: 查询连接到当前Linux主机所在目录有哪些文件
- lls: 查询当前本地上传目录有哪些文件
- lcd: 改变本地上传目录的路径
- cd: 改变远程上传目录
- get: 将远程目录中文件下载到本地目录
- put: 将本地目录中文件上传到远程主机(Linux)
- quit: 断开FTP连接