我必须在远程机器上运行shell脚本(windows/Linux).
我在机器A和B上配置了SSH.我的脚本在机器A上,它将在远程机器上运行我的一些代码,机器B.
本地和远程计算机可以是基于Windows或Unix的系统.
有没有办法使用plink/ssh运行?
我已经设置了ssh代理,我可以在Bash脚本中运行外部服务器上的命令,例如:
ssh blah_server "ls; pwd;"
Run Code Online (Sandbox Code Playgroud)
现在,我真正想做的是在外部服务器上运行很多长命令.将所有这些包含在引号之间会非常难看,而且我宁愿多次避免ssh'ing以避免这种情况.
那么,有没有一种方法可以用括号括起来的一个方法做到这一点?我正在寻找以下内容:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
Run Code Online (Sandbox Code Playgroud)
基本上,只要它干净,我会对任何解决方案感到满意.
为了澄清,我在谈论这是一个更大的bash脚本的一部分.其他人可能需要处理脚本,所以我想保持清洁.我不希望有一个bash脚本,其中一行看起来像:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
Run Code Online (Sandbox Code Playgroud)
因为它非常丑陋且难以阅读.
我有一个在AIX框中运行的Perl脚本.
该脚本尝试从某个目录打开一个文件,但由于该文件没有读取权限,因此无法读取该文件,但我得到了一个不同的错误inappropriate ioctl for device.
它不应该说类似的no read permissions for file东西吗?
这条inappropriate ioctl for device消息是什么意思?
我该如何解决?
编辑:这是我在做的时候发现的strace.
open("/local/logs/xxx/xxxxServer.log", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE,
0666) = 4 _llseek(4, 0, [77146], SEEK_END) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffc14f8) = -1 ENOTTY
(Inappropriate ioctl for device)
我想检查远程主机上是否存在某个文件.我试过这个:
$ if [ ssh user@localhost -p 19999 -e /home/user/Dropbox/path/Research_and_Development/Puffer_and_Traps/Repeaters_Network/UBC_LOGS/log1349544129.tar.bz2 ] then echo "okidoke"; else "not okay!" fi
-sh: syntax error: unexpected "else" (expecting "then")
Run Code Online (Sandbox Code Playgroud) 我有一个脚本,我可以在本地运行远程启动服务器:
#!/bin/bash
ssh user@host.com <<EOF
nohup /path/to/run.sh &
EOF
echo 'done'
Run Code Online (Sandbox Code Playgroud)
运行nohup后,它会挂起.我必须按ctrl-c退出脚本.
我已经尝试在here doc的末尾添加一个显式退出,并为ssh使用"-t"参数.两者都不起作用.如何立即退出此脚本?
编辑:客户端是OSX 10.6,服务器是Ubuntu.
我试图通过我的第一个脚本执行一些命令,但它不起作用.
#!/bin/bash
#connect to server
echo "Connecting to the server..."
ssh -t root@IP '
#switch user to deploy
su - deploy
#switch path
echo "Switching the path"
cd /var/www/deploys/bin/app/config
#run deploy script
echo "Running deploy script"
/usr/local/bin/cap -S env=prod deploy
#restart apache
sudo /bin/systemctl restart httpd.service
bash -l
'
Run Code Online (Sandbox Code Playgroud)
怎么了?我成功连接到服务器,用户被更改,然后我没有看到任何事情发生.当我按下ctrl + c就像在终端中那样,应该执行的命令的一些输出出现,但是有一些错误.
为什么我在启动脚本后看不到终端中发生的一切?我这样做是错误的吗?
顺便说一句:当我尝试手动连接并自己运行命令时,一切都运行良好.
使用CentOS 7.
我正在编写一个运行各种shell命令的PHP程序.有时它需要调用su,并且按照设计,我希望它提示提升特权密码.passthru()在PHP中使用可以正常工作.
我选择了编写功能测试只针对我的程序,因为它依赖于ssh,su和其他shell命令.因此,我想在PHPUnit中运行真实的东西,看看它是否像我期望的那样工作.
由于这需要SSH服务器和用户帐户配置,我已将测试设置为在Docker中运行.这种方法看起来很好 - 图像构建,运行时调用PHPUnit,然后退出.我希望有一种方法可以通过Docker将结果返回给调用系统,例如Travis CI.
我已选择Alpine Linux作为我的基本Docker镜像,但我遇到终端分配问题.我原本以为PHPUnit正在阻碍(参见这个问题的原始版本)但我现在已经缩小到SSH,无论是由PHP运行,还是仅在控制台运行.
这很好用:
su -c whoami
Run Code Online (Sandbox Code Playgroud)
但是,这不是:
ssh localhost -t 'su -c whoami'
Run Code Online (Sandbox Code Playgroud)
我明白了:
su:必须suid才能正常工作
连接到localhost关闭.
请注意,ssh设置了对localhost的无密码访问(用于测试目的),因此我希望输入的唯一密码就是那个su.
ssh建议的手册-f有助于要求密码的位置(交换机"在命令执行之前请求ssh转到后台")所以我试试这个:
ssh localhost -t -f 'su -c whoami'
Run Code Online (Sandbox Code Playgroud)
我得到:
由于stdin不是终端,因此不会分配伪终端.
4275760bde94:〜$ su:必须是suid才能正常工作
啊,另一个错误!好的,所以我尝试了这些想法,特别是强迫终端:
ssh localhost -tt -f 'su -c whoami'
Run Code Online (Sandbox Code Playgroud)
双t仍然会出现关于SUID的投诉,但仍然无效.
但是,如果我在我的Ubuntu开发机上执行此操作(也配置了PPK访问自己),它可以正常工作:
$ ssh localhost -t 'su -c whoami'
Password:
root
Connection to localhost closed.
Run Code Online (Sandbox Code Playgroud)
这使它看起来像Alpine或BusyBox的OpenSSH有问题.我该如何进一步深入研究?
一个解决方案只是交换到另一个基础发行版,Ubuntu肯定会工作正常,但这将大大增加我的Docker图像大小(目前总共68M非常好).所以,如果可以的话,我想坚持使用Alpine.
我确实想知道Docker是否可能阻止创建或附加终端,但很快就打了折扣,因为我可以使用它来获得交互式shell docker …
这以前确实有效!
我的管道中的部署步骤是通过 SSH 连接到 DO 框并从 Docker 注册表中提取代码。如前所述,这之前是有效的,这是我当时deploy的一步,从这里.gitlab-ci.yml得到了很好的灵感:Using SSH
deploy:
stage: deploy
image: docker:stable-dind
only:
- master
services:
# Specifying the DinD version here as the latest DinD version introduced a timeout bug
# Highlighted here: https://forum.gitlab.com/t/gitlab-com-ci-stuck-on-docker-build/34401/2
- docker:19.03.5-dind
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
environment:
name: production
when: manual
before_script:
- mkdir -p ~/.ssh
- echo "$DEPLOYMENT_SERVER_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- eval "$(ssh-agent -S)"
- …Run Code Online (Sandbox Code Playgroud) 我有一个bash脚本,我用来通过ssh连接到远程服务器.这是有效的,但我希望脚本在连接后立即传递cd/some/dir的命令.这似乎不起作用.这是我的代码:
#!/bin/bash
echo "SSHing.."
ssh -i ~/.ssh/some-site.pem xxx@yyy.com
cd /some/dir
read
Run Code Online (Sandbox Code Playgroud)
如何在建立SSH连接后立即执行cd命令?