我的默认远程 shell 是一个麻烦制造者吗?

我的默认远程 shell 是一个麻烦制造者吗?

通过finger tim在服务器上,我了解到我的默认 shell 是一些脚本,/usr/local/bin/bash-wrapper其内容为:

#!/bin/bash

USERNAME=`whoami`

if ! grep ^$USERNAME$ /etc/domain-users > /dev/null; then
   echo -e "You are not authorized to log into this server\n\n"
elif test -z "$2"; then
   echo -e "User authorized"
   /bin/bash
else #in case users are trying to send a command via ssh or use scp
   $2
fi

我现在明白了剧本是我以前的原因使用ssh登录时被踢出。问题现在消失了,因为我最近刚刚添加到正在搜索的文件/etc/domain-usersgrep

现在我的问题是:

  1. 如果我发送一个让服务器 shell 在同一行运行的命令,脚本会做什么ssh,例如以下两个问题第 2 部分和第 3 部分?

  2. 是不是这个原因我的公钥副本失败:

    $ cat /home/tim/.ssh/id_rsa.pub | ssh tim@server 'cat >> .ssh/authorized_keys'
    Password: 
    cat: >>: No such file or directory
    cat: .ssh/authorized_keys: No such file or directory
    

    我也尝试过ssh-copy-id,但也不起作用:

    $ ssh-copy-id tim@server
    Password: 
    /usr/local/bin/bash-wrapper: line 11: umask: 077;: octal number out of range
    
  3. 以下 ssh-tunneling 命令在我的本地也运行得不好:

    ssh -f -D 9999 tim@server "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done"
    

    这是我得到的错误

    /usr/local/bin/bash-wrapper: line 11: if: command not found
    

    我想知道为什么?

  4. 我的登录速度总是很慢。是因为grep需要时间吗?请注意,搜索/etc/domain-users的文件grep有 199 行,每行都是一个用户名。它应该需要很长时间才能grep完成其工作吗?

  5. 如何更改我的默认 shell?

感谢致敬!

答案1

遍历 200 行文件应该需要几毫秒左右的时间,所以我对此表示怀疑。

尝试ssh -vvv tim@server看看是什么减慢了速度。

您的默认 shell 保存在/etc/passwd该行的末尾:

drjimbob:x:1000:1000:jim bob,,,:/home/drjimbob:/bin/bash

chsh tim -s /bin/bash并且可以通过(change shell)进行更改,尽管您通常必须具有 root 权限才能更改默认 shell,如果您有用户密码(不需要 root 权限),则可以执行此操作。

请注意,这/usr/bin/ssh-copy-id只是一个脚本,给您带来麻烦的行是:

{ eval "$GET_ID" ; } | ssh ${1%:} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1

如果你测试这个;使用像 test_script.sh 这样的脚本

#!/bin/bash

umask 077; echo "Works fine"
$2

并像这样运行它bash -v -x test_script.sh "ignored_first_parameter" "umask 077; echo 'no'"

您将看到变量“umask 077; echo no”的 bash 标记化(基于环境变量$IFS)进入第二个参数,然后 shell 扩展告诉 bash 运行umask '077;'给出错误的命令。

这基本上是因为输入 bashcommand1; command2与设置变量some_var='command1; command2"然后运行$some_var​​.

看:http://www.gnu.org/software/bash/manual/bashref.html


编辑:解决您的具体问题;

(1) 我仍然认为这种访问控制方法是可疑的,如果用户具有其他类型的访问权限,则可能会被标准技巧之一所规避。假设他们可以通过 ftp 访问其用户目录;他们可能会上传一个 .login 文件(包含一个假的 $PATH 和一个假的 whoami)来让他们登录。

至少脚本应该指定完整路径whoami(在我的 ubuntu 机器上/usr/bin/whoami;在不同的系统上可能会有所不同)。看:Linux 安全编程第 5.2 章

对于无法登录的用户禁用 shell 似乎更干净(例如,对于不在列表中的用户将 shell 设置为/bin/falsein )。/etc/passwd或者(或另外),如果您只担心远程登录,可以使用一个设置来/etc/ssh/sshd_config使用某种组合来AllowUsers/AllowGroups将用户/组列入白名单或DenyUsers/DenyGroups将用户/组列入 ssh 黑名单(尽管请注意,如果有物理连接,这些用户可以登录)访问机器)。

但是,如果您的主管修改了他们的脚本以使用eval $2它,应该可以解决 ssh-copy-id 的直接问题。看Bash:为什么使用带有变量扩展的 eval

#!/bin/bash

USERNAME=`whoami`

if ! grep ^$USERNAME$ /etc/domain-users > /dev/null; then
 echo -e "You are not authorized to log into this server\n\n"
elif test -z "$2"; then
 echo -e "User authorized"
 /bin/bash
else #in case users are trying to send a command via ssh or use scp
 eval $2
fi

对于问题2-5;答案:(2) 是,(3) 是,(4) 否,(5) chsh tim -s /bin/bash

相关内容