我在通过包含特殊字符的 SSH 执行远程命令时遇到问题。我正在尝试从 MySQL 导出数据库以进行备份。这是我在本地脚本中的命令:
#!/bin/bash
ssh user@host "mysqldump -u dbname -p'p$ssw0rd' --lock-tables=false dbname > ~/sites/mysite/backup/dbname.sql"
Run Code Online (Sandbox Code Playgroud)
如您所见,我在密码周围使用了 ' 字符。当我执行此脚本时,出现以下错误:
mysqldump: Got error: 1045: Access denied for user 'dbname'@'localhost' (using password: YES) when trying to connect
Run Code Online (Sandbox Code Playgroud)
但是,当我手动 ssh 进入机器并执行命令时,它执行得很好。我的印象是通过 ssh 执行命令会丢失一些东西并且密码没有通过。
如何通过 ssh 执行带有特殊字符的命令?
我有一个奇怪的问题。每次我停止 Tomcat 时,SSH 都会变得很慢,几乎完全没有响应。SSH 接受任何命令需要一分钟甚至更长时间。当我终于再次启动 Tomcat 时,一切都恢复正常。
这是在非常繁忙的服务器上发生的。问题是由于应用程序升级,我需要经常停止Tomcat。升级通常需要几秒钟,但在这里需要将近 10 分钟,因此我们遇到了不必要的停机时间。
我看到的一件事是,当我停止 Tomcat 时top,会ksoftirqd/X以 100% 的 CPU显示很多进程。这可能是问题吗?
内核版本是: 2.6.18-308.11.1.el5
红帽版本是: Red Hat Enterprise Linux Server release 5.9 (Tikanga)
知道为什么会这样吗?
git clone gituser@<server>:myRepo.git 不起作用,失败并显示错误消息:
fatal: ''myRepo.git'' does not appear to be a git repository
背景:
我们有一台装有 Git Bash 和 Bitvise WinSSHd(在C:)的 Windows 7 机器。SSH 服务器设置为<git dir>/bin/sh.exe --login用作 shell,主目录设置为/a/. 我可以很好地通过 SSH 连接到服务器,它会按预期将我放入 Git Bash shell,从/a/目录开始。
我在/a/myRepo.git(在A:磁盘上)有一个裸存储库,它可以完成它应该做的一切,只要我们在本地进行。我可以git clone /a/myRepo.git,处理它,推拉,只要它是本地的(或通过 SSH 的“本地”)就没有问题。此外,我们将 A: 磁盘设置为共享文件夹,我可以使用\\<server>\myRepo.git.
但是,当我尝试远程克隆时,我无法弄清楚哪些选项组合可以使其工作:明显的克隆字符串不起作用,将绝对路径名放在 *nix 转换格式 ( /a/myRepo.gitand A:/myRepo.git) 或 Windows 格式 ( A:\\myRepo.git) 失败并出现相同的错误,目录的权限设置为允许所有用户,我也在git config core.sharedRepository all服务机器上设置。
我怀疑 Git Bash …
我正在一个使用很多这样的命令的平台上工作:
ssh login@server.com 'curl http://some_server/script.sh | bash'
这对于远程执行脚本来说非常干净和方便,但是,无论如何我都看不到获取脚本的输出/退出代码。任何人都可以找出一些方法来确保脚本已正确执行(从启动 ssh 的主机的角度来看)。
是否存在可以控制服务器的攻击者可以访问客户端并在客户端上启动操作的条件?我意识到攻击者可以在服务器上植入木马,希望 SSH 客户端背后的用户(手动或通过运行脚本)拖入木马,但是否还有其他攻击途径?
我对不涉及密码且仅使用公钥身份验证的场景特别感兴趣,可能在连接的两端使用相同的用户凭据。
有时使用带有空密码短语的 ssh 密钥是非常可取的(备份,...)。众所周知的问题是,这样的密钥只有在不受信任的人手中才能安全。
然而,在它们被泄露的情况下,可以通过在服务器authorized_keys文件中为它们添加一些选项来进一步保护这些密钥免于造成太大伤害,例如:
command="/usr/bin/foo",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa AAA.....
Run Code Online (Sandbox Code Playgroud)
理论上,该密钥只能用于/usr/bin/foo
在服务器上运行命令。然后出现了一个新问题,因为每个命令都需要一个特殊的专用密钥。
出于这个原因,可以在互联网上找到更详细的变体(例如,在同一个站点上:sshd_config 与 authorized_keys 命令参数),其中包括安装一个仅限于本地制作的脚本的通用密钥,该脚本将使用SSH_ORIGINAL_COMMAND环境变量集通过 ssh。
(受限制的)键模糊authorized_keys然后看起来像:
command="/usr/local/bin/myssh",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa AAA.....
Run Code Online (Sandbox Code Playgroud)
和myssh脚本将如下所示:
#!/bin/sh
msg="Command not allowed with this key"
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo $msg
;;
*\(*)
echo $msg
;;
*\{*)
echo $msg
;;
*\;*)
echo $msg
;;
*\<*)
echo $msg
;;
*\`*)
echo $msg
;;
*\|*)
echo $msg
;;
rsync\ --server*)
# optionnally check for extra arguments
# ....
# then …Run Code Online (Sandbox Code Playgroud) 我需要连接到我无法通过防火墙访问的服务器上的 MySQL 数据库。但是,我确实可以通过 SSH 访问另一台服务器,该服务器允许通过目标服务器上的防火墙。
我已通过 SSH 连接到后者(假设为 host1),然后我尝试执行以下命令:
mysql --host=host2 --user=username --password=password
Run Code Online (Sandbox Code Playgroud)
我收到以下回复:
Access denied for user 'username'@'host1' (using password: YES)
Run Code Online (Sandbox Code Playgroud)
为什么它试图连接到 host1(即它本身)?
注意:我没有localhost在这里使用任何地方。
我以前在我的本地(Mac OS x 10.6)/etc/hosts 文件中添加了我服务器的公共 ip,如下所示:
123.123.123.123 myServer
Run Code Online (Sandbox Code Playgroud)
允许我 ssh 到 myServer 而不必记住服务器的 IP 地址并且工作正常(使用 shh 公钥),如下所示:
ssh myServer1
Run Code Online (Sandbox Code Playgroud)
但是,在 Amazon EC2 实例上,我尝试使用提供的长公共 dns 地址执行相同操作,并在 /etc/hosts 中添加了以下内容:
ec2-23-23-23-23.compute-1.amazonaws.com myServer2
Run Code Online (Sandbox Code Playgroud)
但是当我尝试 ssh myServer2 时说“无法解析主机名”
任何想法为什么这不起作用?我怎样才能使这项工作?
我要使用的完整命令是:
ssh -i key.pem user@ec2-23-23-23-23.compute-1.amazonaws.com
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个快捷方式,可能是这样的:
ssh -l username myServer2 or ssh -i key.pem -l username myServer2
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
更新:我改用别名,这更容易:
在 .bash_profile (MAC OS x) 中添加了这个
alias myServer='ssh -i /path/to/key.pem user@ec2-23-23-23-23.compute-1.amazonaws.com'
Run Code Online (Sandbox Code Playgroud)
(需要再次关闭并打开终端或使用 source ~/.bash_profile )然后在命令行 $ myServer 上使用 myServer ssh
在我处理多任务的日子里,有时我会因为某种原因(空闲超时等)而从 SSH 会话中启动,而我正在处理另一项任务。当我返回终端时,我会发现自己回到了 localhost,需要通过 SSH 回到服务器。回到服务器后,~默认情况下我总是在我的主目录中,我需要导航回我最后所在的目录(如果我记得的话)才能继续工作。
登录时是否可以自动返回到我工作的最后一个目录?
我在想一个自制解决方案将别名cd更改目录,但也会将该目录保存到某个环境变量中,然后在我的.bash_profile.
但是 Linux 中已经有这样的功能了吗?
我目前正在调查是否可以在类似于 gitolite 为 git 所做的设置中为 bzr 提供服务。这意味着一个 unix 帐户,通过他们的 ssh 公钥管理不同的用户。我很乐意将其与 gitolite 集成,在这种情况下,~/.ssh/authorized_keys可以委托用户管理和创建合适的。这将处理身份验证。
让我担心的是授权。在我看来,bzr serve开箱即用只有--directory提供访问控制的标志。这适用于为每个用户提供他或她自己的一组存储库,或者用于将用户分配到组并为每个组提供一组固定的存储库。多做一点工作,一个用户可以使用一个目录,但使用符号链接允许多个用户共享访问存储库。
尽管如此,这仍然远不及gitolite所能做到的。使用这种方法,不可能授予单个用户对某些存储库的只读访问权限,但授予对其他存储库的读写访问权限。也无法防止覆盖推送或在用户目录中创建新存储库。
可能是这些功能还没有实现。在相关的 Stack Overflow 问题中,我问的是如何自己实现这一点。在服务器故障上,我专注于现有的解决方案。是否有任何现成的解决方案赋予bzr serve比简单--directory限制更细粒度的访问控制?像 gitolite 这样的完全集成的解决方案将是最有趣的,但即使是一些可能被配置为解决我提到的问题之一的扩展也会很高兴知道。